我正在学习如何在bash中使用I / O重定向,并尝试使用管道的一些示例:
pwd | say
ls -l | grep "staff" > out.txt
但是当我尝试使用管道重定向同时使用pwd
和open
时,命令失败,我只是接收open
用法。
我正在尝试的是:pwd | open
从bash打开当前目录的正确方法是什么?
答案 0 :(得分:6)
事后看来, 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
要求输入通过命令行参数 提供,而不是通过 {{1}输入流,就像这里的情况一样(通过管道,stdin
)。|
实用程序。xargs
接受stdin输入 - 在这种情况下来自管道 - 并调用指定为的命令>参数(在这种情况下为xargs
),标记化的stdin输入为该命令的参数。 open
默认情况下按空格进行拆分:
xargs
作为输入,不会发生拆分(或由shell解释),因此只能.
转到echo
。xargs
shell变量始终包含当前dir。的完整路径,可能包含嵌入式空白,所以需要额外的步骤以确保它作为单参数传递给$PWD
:
open
打印当前目录。以NUL字节(printf '%s\0' "$PWD"
)终止的完整路径。0x0
通过NUL将stdin输入拆分为令牌 - 在这种情况下产生单令牌,保留单个输入行的值 - 包含xargs -0
- 原样。这样做是安全的,因为NUL不是文件名中的合法字节。
$PWD
是POSIX standard for xargs
的非标准扩展名,但它已在BSD -0
中实现(在OSX上使用)和GNU xargs
(在Linux上使用)。对于符合POSIX标准的 [1] ,下一个最好的方法是使用xargs
选项使用基于 line 的标记化,如下所示:-I
因此,实际上上述解决方案等同于到(printf '%s' "$PWD" | xargs -I % open %
最终执行的内容 - 请参阅下一节的解释):
xargs
[1] open .
# Equivalent solution.
open "$PWD"
' xarg
选项需要符合XSI条件的POSIX系统。如果有人能够向我解释实用术语中的含义,我将不胜感激。
B:提供最佳答案 对所使用的技术没有限制 :
-I
open .
期望参数而不是open
输入,stdin
简洁且最有效地表示当前目录,导致.
显示open
中当前文件夹的内容。
一个等效但更详细的解决方案是传递特殊的shell变量Finder
,它始终包含当前目录的完整路径(在 double 引号中引用,以便保护来自shell expansions:
$PWD
答案 1 :(得分:5)
-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
答案 2 :(得分:0)
如果您要为pwd
打开Finder,可以执行pwd | xargs open
。