This question already has answers here:
How to pass command output as multiple arguments to another command
(4个答案)
两年前关闭。
我正在学习如何在bash中使用I/O重定向,并尝试了一些使用管道的示例,如:
但是当我尝试使用管道重定向同时使用
我想说的是:
从bash打开当前目录的正确方法是什么?
是通过管道将当前目录的路径传递到
请注意,
因此,为了将stdin输入转换为参数,需要标准的
以
相反,特殊的外壳变量总是包含当前目录的完整路径,它可能包含嵌入的空白,因此需要额外的步骤来确保它作为单个参数传递给
补充的是,
注意:
因此,实际上上述解决方案相当于(最终执行的结果-请参阅下一节的解释):
[1]
B:为了提供最佳答案,而不限制所采用的技术:
一个等效但更详细的解决方案是传递特殊的shell变量
(4个答案)
两年前关闭。
我正在学习如何在bash中使用I/O重定向,并尝试了一些使用管道的示例,如:
pwd | say
ls -l | grep "staff" > out.txt
但是当我尝试使用管道重定向同时使用
pwd
和open
时,命令失败,我只收到open
用法。我想说的是:
pwd | open
从bash打开当前目录的正确方法是什么?
最佳答案
事后看来,有两个不同的答案:
答:回答操作人员提出的问题,以了解管道和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
输入流提供输入,这里就是这样(通过管道,|
)。因此,为了将stdin输入转换为参数,需要标准的
xargs
实用程序。xargs
接受stdin输入(在本例中来自管道),并调用指定为其参数的命令(在本例中为open
),使用标记化的stdin输入作为该命令的参数。xargs
默认情况下按空白拆分:以
.
作为输入,不会发生分裂(或由shell解释),因此可以将其echo
编辑为xargs
。相反,特殊的外壳变量总是包含当前目录的完整路径,它可能包含嵌入的空白,因此需要额外的步骤来确保它作为单个参数传递给
$PWD
:open
打印以NUL字节结尾的当前目录的完整路径(printf '%s\0' "$PWD"
)。补充的是,
0x0
通过NUL将stdin输入拆分为令牌-在本例中产生单个令牌,保留单个输入行的值-包含xargs -0
-原样。这是安全的,因为NUL在文件名中不是合法字节。注意:
$PWD
是POSIX 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