砰的一声打开,管道不工作



我正在学习如何在bash中使用I/O重定向,并尝试了一些管道示例,如:

pwd | say
ls -l | grep "staff" > out.txt

但是,当我尝试使用管道重定向同时使用pwdopen时,该命令失败,我只收到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

是通过管道将当前目录的路径传递到openCLI以使其在OSX的文件系统浏览器GUI应用程序Finder中打开该目录的最稳健的方法。

请注意,pwd | xargs open是不健壮的,因为如果当前目录路径嵌入了空白,它就会失败——请参阅下文

  • open要求输入通过命令行参数提供,而不是通过stdin输入流提供,就像这里的情况一样(通过管道|)
  • 因此,为了将stdin输入转换为参数,需要标准的xargs实用程序
  • xargs接受来自管道的stdin输入(在本例中为),并调用指定为参数的命令(在本案中为open),其中标记化的stdin输入作为该命令的参数
  • xargs默认情况下由空白分隔
    • .为输入,不会发生分裂(或外壳的解释),因此它可以只是echoxargs
    • 相比之下,特殊的$PWDshell变量(始终包含当前目录的完整路径)可能包含嵌入的空白,因此需要额外的步骤来确保它作为单个参数传递给open
      • printf '%s' "$PWD"打印以NUL字节(0x0)终止的当前目录的完整路径
      • 作为补充,xargs -0通过NUL将stdin输入拆分为令牌,在这种情况下产生一个单个令牌,将包含$PWD-的单个输入行的值保持为。这样做是安全的,因为NUL不是文件名中的合法字节。
        • 注意:-0xargs的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输入,.简洁而高效地表示当前目录,从而使openFinder中显示当前文件夹的内容。

一个等效但更详细的解决方案是传递特殊的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

相关内容

  • 没有找到相关文章

最新更新