我正在学习如何在bash中使用I/O重定向,并尝试了一些管道示例,如:
pwd | say
ls -l | grep "staff" > out.txt
但是,当我尝试使用管道重定向同时使用pwd
和open
时,该命令失败,我只收到open
的用法。
我正在尝试的是:pwd | open
从bash打开当前目录的正确方法是什么?
事后来看,有两个不同的答案:
A:按照要求回答OP的问题,以了解管道和I/O流:
echo . | xargs open
# Equivalent solution, using the special "$PWD" shell variable.
printf '%s ' "$PWD" | xargs -0 open
是通过管道将当前目录的路径传递到open
CLI以使其在OSX的文件系统浏览器GUI应用程序Finder
中打开该目录的最稳健的方法。
请注意,pwd | xargs open
是不健壮的,因为如果当前目录路径嵌入了空白,它就会失败——请参阅下文
open
要求输入通过命令行参数提供,而不是通过stdin
输入流提供,就像这里的情况一样(通过管道|
)- 因此,为了将stdin输入转换为参数,需要标准的
xargs
实用程序 xargs
接受来自管道的stdin输入(在本例中为),并调用指定为其参数的命令(在本案中为open
),其中标记化的stdin输入作为该命令的参数xargs
默认情况下由空白分隔:- 以
.
为输入,不会发生分裂(或外壳的解释),因此它可以只是echo
到xargs
- 相比之下,特殊的
$PWD
shell变量(始终包含当前目录的完整路径)可能包含嵌入的空白,因此需要额外的步骤来确保它作为单个参数传递给open
:printf '%s ' "$PWD"
打印以NUL字节(0x0
)终止的当前目录的完整路径- 作为补充,
xargs -0
通过NUL将stdin输入拆分为令牌,在这种情况下产生一个单个令牌,将包含$PWD
-的单个输入行的值保持为。这样做是安全的,因为NUL不是文件名中的合法字节。- 注意:
-0
是xargs
的POSIX标准的非标准扩展,但它在BSDxargs
(在OSX上使用)和GNUxargs
(在Linux上使用)中都实现了。保持POSIX兼容[1],接下来最好的事情是使用基于行的标记化和-I
选项,如下所示:printf '%s' "$PWD" | xargs -I % open %
- 注意:
- 以
因此,上述解决方案实际上相当于(xargs
最终执行的内容-请参阅下一节的解释):
open .
# Equivalent solution.
open "$PWD"
[1]xarg
的-I
选项需要一个同样符合XSI的POSIX系统。如果有人能用实用的术语向我解释这意味着什么,我将不胜感激
B:提供最佳答案,对所用技术无限制:
open .
open
需要参数而不是stdin
输入,.
简洁而高效地表示当前目录,从而使open
在Finder
中显示当前文件夹的内容。
一个等效但更详细的解决方案是传递特殊的shell变量$PWD
,它始终包含当前目录的完整路径(在双引号中引用),以保护它不受shell扩展的影响:
open "$PWD"
man打开:
-f Reads input from standard input and opens the results in the
default text editor. End input by sending EOF character (type
Control-D). Also useful for piping output to open and having
it open in the default text editor.
相同的手册,在"示例"下:
ls | open -f
将"ls"命令的输出写入/tmp中的文件,并在默认文本编辑器(由LaunchServices确定)。
因此,您可以执行pwd | open -f
如果您想为pwd
打开Finder,可以执行pwd | xargs open
。