This question already has answers here:
How to pass command output as multiple arguments to another command
(4个答案)
两年前关闭。
我正在学习如何在bash中使用I/O重定向,并尝试了一些使用管道的示例,如:
pwd | say
ls -l | grep "staff" > out.txt

但是当我尝试使用管道重定向同时使用pwdopen时,命令失败,我只收到open用法。
我想说的是:pwd | open
从bash打开当前目录的正确方法是什么?

最佳答案

事后看来,有两个不同的答案:
答:回答操作人员提出的问题,以了解管道和I/O流:

echo . | xargs open

# Equivalent solution, using the special "$PWD" shell variable.
printf '%s\0' "$PWD" | xargs -0 open

是通过管道将当前目录的路径传递到openCLI的最可靠的方法,以便让它在OSX的文件系统浏览器GUI应用程序Finder中打开该目录。
请注意,pwd | xargs open不是健壮的,因为如果当前目录路径嵌入了空格,那么它将失败-请参见下文。
open要求通过命令行参数而不是通过stdin输入流提供输入,这里就是这样(通过管道,|)。
因此,为了将stdin输入转换为参数,需要标准的xargs实用程序。
xargs接受stdin输入(在本例中来自管道),并调用指定为其参数的命令(在本例中为open),使用标记化的stdin输入作为该命令的参数。
xargs默认情况下按空白拆分:
.作为输入,不会发生分裂(或由shell解释),因此可以将其echo编辑为xargs
相反,特殊的外壳变量总是包含当前目录的完整路径,它可能包含嵌入的空白,因此需要额外的步骤来确保它作为单个参数传递给$PWD
open打印以NUL字节结尾的当前目录的完整路径(printf '%s\0' "$PWD")。
补充的是,0x0通过NUL将stdin输入拆分为令牌-在本例中产生单个令牌,保留单个输入行的值-包含xargs -0-原样。这是安全的,因为NUL在文件名中不是合法字节。
注意:$PWDPOSIX standard for -0的非标准扩展,但它同时在BSDxargs和GNUxargs中实现(在Linux上使用)。保持POSIX兼容[1],下一个最好的方法是使用基于行的标记化和xargs选项,如下所示:
-I
因此,实际上上述解决方案相当于(最终执行的结果-请参阅下一节的解释):
open .

# Equivalent solution.
open "$PWD"

[1]printf '%s' "$PWD" | xargs -I % open %xargs选项需要一个也符合XSI的POSIX系统。如果有人能向我解释一下那是什么意思,我将不胜感激。
B:为了提供最佳答案,而不限制所采用的技术:
open .

xarg需要参数而不是-I输入,并且open简洁高效地表示当前目录,导致stdin.中显示当前文件夹的内容。
一个等效但更详细的解决方案是传递特殊的shell变量open,该变量始终包含当前目录的完整路径(用双引号引用,以便保护它不受shell expansions
open "$PWD"

关于macos - Bash pwd并在管道打开的情况下无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29778479/

10-15 13:08