<分区>
我正在学习如何在 bash 中使用 I/O 重定向,并尝试了一些使用管道的示例,例如:
pwd | say
ls -l | grep "staff" > out.txt
但是当我尝试使用管道重定向同时使用 pwd
和 open
时,命令失败,我只收到 open
用法。
我正在尝试的是:pwd |打开
从 bash 打开当前目录的正确方法是什么?
<分区>
我正在学习如何在 bash 中使用 I/O 重定向,并尝试了一些使用管道的示例,例如:
pwd | say
ls -l | grep "staff" > out.txt
但是当我尝试使用管道重定向同时使用 pwd
和 open
时,命令失败,我只收到 open
用法。
我正在尝试的是:pwd |打开
从 bash 打开当前目录的正确方法是什么?
最佳答案
事后看来,有2个不同的答案:
答:按要求回答 OP 的问题,以理解管道和I/O 流:
echo . | xargs open
# Equivalent solution, using the special "$PWD" shell variable.
printf '%s\0' "$PWD" | xargs -0 open
是将当前目录的路径传递给 open
CLI 通过管道 以使其在 OSX 的文件系统浏览器中打开该目录的最可靠方法GUI 应用程序,Finder
。
注意 pwd | xargs open
并不健壮,因为如果当前目录路径包含空格,它就会失败 - 见下文。
open
要求通过命令行参数而不是通过stdin
输入流提供输入,就像这里的情况一样(通过管道,|
)。xargs
实用程序。xargs
采用标准输入 - 在本例中来自管道 - 并调用指定为其参数的命令(打开
,在这种情况下)将标记化的标准输入作为该命令的参数。xargs
默认按 whitespace 分割:
.
作为输入,不会发生拆分(或由 shell 解释),因此它可以被 echo
ed 到 xargs
.$PWD
shell 变量可能包含嵌入空格,因此需要额外的步骤来确保它作为单个参数传递给open
:
printf '%s\0' "$PWD"
打印以 NUL 字节 (0x0
) 结尾的当前目录的完整路径。xargs -0
通过 NUL 将 stdin 输入拆分为标记 - 在这种情况下产生单个标记,保留单个输入行的值 - 包含 $PWD
- 原样。这样做是安全的,因为 NUL 不是文件名中的合法字节。
-0
是 POSIX standard for xargs
的非标准扩展 ,但它同时在 BSD xargs
(在 OSX 上使用)和 GNU xargs
(在 Linux 上使用)中实现。保持 POSIX 兼容[1],下一个最好的办法是使用基于 line 的标记化和 -I
选项,如下所示:printf '%s' "$PWD"| xargs -I % 打开 %
因此,实际上,上述解决方案等同于(xargs
最终执行的内容 - 参见下一节的解释):
open .
# Equivalent solution.
open "$PWD"
[1] xarg
的-I
选项需要一个也是XSI 的POSIX 系统- 合规。如果有人能用实用的术语向我解释这意味着什么,我将不胜感激。
B:提供最佳答案,不限制使用的技术:
open .
open
需要参数 而不是 stdin
输入,而 .
简洁且最有效地表示当前目录,导致 open
在 Finder
中显示当前文件夹的内容。
一个等效但更冗长的解决方案是传递特殊的 shell 变量 $PWD
,它始终包含当前目录的完整路径(在 双引号 中引用,以保护它不受 shell expansions 的影响:
open "$PWD"
关于macos - Bash pwd 并打开管道不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29778479/
相关文章:
css - 防止在 WebKit/Blink 中为 MacOS 触控板用户隐藏滚动条
macos - Mac OSX上的XAMPP:为什么以 'daemon'身份运行?
linux - 是否可以传递 linux bash 脚本的内部命令请求的参数?
bash - 使用 grep 和 cut delimiter 命令(在 bash shell 脚本 UNIX 中)- 和 "reversing"一样吗?
node.js - 阻止 Node 进程退出的最简单的代码量是多少?
linux - 无法 dlopen 加载模块 '/usr/lib/pa20_64/libpthread.1',因为它包含线程特定数据