Bash pwd并打开管道不工作

时间:2015-04-21 16:49:29

标签: macos bash unix terminal

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

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

但是当我尝试使用管道重定向同时使用pwdopen时,命令失败,我只是接收open用法。

我正在尝试的是:pwd | open

从bash打开当前目录的正确方法是什么?

3 个答案:

答案 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不是文件名中的合法字节。
        • 注意:$PWDPOSIX 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)

man open

-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