Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在管道不工作的情况下猛击pwd并打开_Macos_Bash_Unix_Terminal - Fatal编程技术网

Macos 在管道不工作的情况下猛击pwd并打开

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确定) 因此,您

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

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输入,在本例中为,并调用指定为其参数的命令(在本例中为
    open
    ),将标记化的stdin输入作为该命令的参数。
  • xargs
    默认情况下按空格分割
    • 使用
      作为输入时,不会发生拆分(或shell解释),因此可以将其
      echo
      ed设置为
      xargs
    • 相比之下,特殊的
      $PWD
      shell变量(始终包含当前目录的完整路径)可能包含嵌入的空格,因此需要额外的步骤来确保它作为单个参数传递给
      open
      • printf“%s\0'$PWD”
        打印以NUL字节(
        0x0
        )结尾的当前目录的完整路径
      • 作为补充,
        xargs-0
        通过NUL将stdin输入拆分为令牌-在这种情况下生成一个令牌,保留包含
        $PWD
        的单个输入行的值。这样做是安全的,因为NUL不是文件名中的合法字节。
        • 注意:
          -0
          是对的非标准扩展,但它同时在BSD
          xargs
          (在OSX上使用)和GNU
          xargs
          (在Linux上使用)中实现。保持POSIX兼容[1],下一个最好的方法是使用基于行的标记化和
          -I
          选项,如下所示:
          printf“%s'$PWD”| xargs-I%open%
因此,上述解决方案实际上相当于(xargs最终执行的内容-请参见下一节的解释):

[1]
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