Macos 在管道不工作的情况下猛击pwd并打开
我正在学习如何在bash中使用I/O重定向,并尝试了一些使用管道的示例,如:Macos 在管道不工作的情况下猛击pwd并打开,macos,bash,unix,terminal,Macos,Bash,Unix,Terminal,我正在学习如何在bash中使用I/O重定向,并尝试了一些使用管道的示例,如: pwd | say ls -l | grep "staff" > out.txt 但是当我尝试使用管道重定向同时使用pwd和open时,命令失败,我只收到open用法 我尝试的是:pwd | open 从bash打开当前目录的正确方法是什么?: 同一手册,在“示例”下: ls|open-f 将“ls”命令的输出写入/tmp中的文件,并在中打开该文件 默认文本编辑器(由LaunchServices确定) 因此,您
pwd | say
ls -l | grep "staff" > out.txt
但是当我尝试使用管道重定向同时使用pwd
和open
时,命令失败,我只收到open
用法
我尝试的是:pwd | open
从bash打开当前目录的正确方法是什么?:
同一手册,在“示例”下:
ls|open-f
将“ls”命令的输出写入/tmp中的文件,并在中打开该文件
默认文本编辑器(由LaunchServices确定)
因此,您可以执行
pwd | open-f
如果您想为pwd
打开Finder,您可以执行pwd | xargs open
事后诸葛亮,有两个不同的答案:
echo . | xargs open
# Equivalent solution, using the special "$PWD" shell variable.
printf '%s\0' "$PWD" | xargs -0 open
open .
A:回答OP的问题,以了解管道和I/O流:
echo . | xargs open
# Equivalent solution, using the special "$PWD" shell variable.
printf '%s\0' "$PWD" | xargs -0 open
open .
是通过管道将当前目录的路径传递到open
CLI的最可靠的方法,以便在OSX的文件系统浏览器GUI应用程序Finder
中打开该目录
请注意,
pwd | xargs open
不是健壮的,因为如果当前目录路径中嵌入了空格,它将失败-请参见下文
- 要求通过命令行参数提供输入,而不是通过
输入流(通过管道,stdin
)|
- 因此,为了将stdin输入转换为参数,需要标准的
实用程序xargs
- 接受来自管道的stdin输入,在本例中为,并调用指定为其参数的命令(在本例中为
),将标记化的stdin输入作为该命令的参数。open
默认情况下按空格分割:xargs
- 使用
作为输入时,不会发生拆分(或shell解释),因此可以将其
ed设置为echo
xargs
- 相比之下,特殊的
shell变量(始终包含当前目录的完整路径)可能包含嵌入的空格,因此需要额外的步骤来确保它作为单个参数传递给$PWD
:open
打印以NUL字节(printf“%s\0'$PWD”
)结尾的当前目录的完整路径0x0
- 作为补充,
通过NUL将stdin输入拆分为令牌-在这种情况下生成一个令牌,保留包含xargs-0
的单个输入行的值。这样做是安全的,因为NUL不是文件名中的合法字节。$PWD
- 注意:
是对的非标准扩展,但它同时在BSD-0
(在OSX上使用)和GNUxargs
(在Linux上使用)中实现。保持POSIX兼容[1],下一个最好的方法是使用基于行的标记化和xargs
选项,如下所示:-I
printf“%s'$PWD”| xargs-I%open%
- 注意:
- 使用
xarg
的-I
选项需要同样兼容的POSIX系统。如果有人能从实际角度向我解释这意味着什么,我将不胜感激
B:在不限制所用技术的情况下提供最佳答案:
echo . | xargs open
# Equivalent solution, using the special "$PWD" shell variable.
printf '%s\0' "$PWD" | xargs -0 open
open .
open
需要参数而不是stdin
输入,并且
简洁高效地表示当前目录,导致open
在Finder
中显示当前文件夹的内容
一个等效但更详细的解决方案是传递特殊的shell变量$PWD
,该变量始终包含当前目录的完整路径(以双引号引用,以保护其免受以下影响):
那是什么
open
命令?它读取标准输入吗?open
从shell打开文件。我如何检查它是否接收标准输入?如果你想为pwd
打开Finder,你可以执行pwd | xargs open
@khachik谢谢,你应该将此作为答案发布,因为这对我有效。注意pwd | xargs open
不稳定,因为如果当前目录路径嵌入空格,它将失败。我尝试了您的解决方案,它在文本编辑器中打开一个新文件,其中写入了当前目录。但我尝试的是让Finder打开当前目录。例如,如果我使用:open/Users/MyUser
Finder将在Finder中打开目录。@romsearcher完全不涉及管道或重定向。您可以使用open.
或等效的open“$(pwd)”
是的,您是对的,管道不是必需的,但我试图了解管道的用法,并想知道为什么管道在此设置中不起作用。参数和管道是分开的。您可以使用xargs
将管道数据转换为参数,使用echo
将参数转换为管道数据。这将与具有embe的路径中断dded空格。如果涉及管道并且确实需要xargs
,请使用pwd | xargs-I{}open{}
。但是,正如@thatotherguy在他自己答案的评论中指出的那样,打开“$(pwd)”
,或者更好的是,打开“$pwd”
,或者,最好是打开。@mklement0这不是解决一些实际问题的方法,OP试图理解管道,而打开。
是打开目录最直接的方法,它并没有回答这个问题。Agr