为什么我不能通过管道进入 cd?

mor*_*eus 10 bash

为什么我不能将东西通过管道传输到 cd 中?

例子:

$ pwd >> ~/mloc
$ cd /
$ tail -n 1 ~/mloc | cd
Run Code Online (Sandbox Code Playgroud)

cd 失败。如果这样做:cd $(tail -n 1 ~/mloc),它的工作原理。

我理解我写的最后一个命令有效,但我不明白为什么我不能输入 cd。

Eli*_*gan 13

管道到进程会向它发送数据,而不是您在启动进程键入的内容,而不是您在启动进程的命令中键入的内容。

cd也不是一个过程,但这不太重要,我在下面解决它。)

管道将一个命令的输出附加到另一个命令的输入。考虑:

foo | bar
Run Code Online (Sandbox Code Playgroud)

运行bar,运行foo,和:

  • 不是foo在终端上显示的输出,而是将其bar作为输入。
  • 它不是从终端获取输入,而是从输出获取它。bar foo

(这两个要点实际上都表达了同样的意思。)

那么,当你运行时会发生什么tail -n 1 ~/mloc | cd

  • 它运行,cd并且无论何时cd在运行时接受输入,它都会从 的输出中获取该输入tail -n 1 ~/mloc
  • cd 运行时从不接受输入。

有关此答案中输入输出的确切含义的更多信息,请参阅标准流(维基百科)。(这里,输入是指“标准输入”,输出是指“标准输出”。)

还有一个问题cd实际上不是一个程序,而是一个内置的 shell,所以当你运行时cd不会启动新进程。但这并不是您尝试的方法不起作用的真正原因,因为:

  • 正如您一直在尝试的那样,使用管道传递命令行参数将永远不适用于任何程序。

  • 没有理由的壳不能写入,以适应管一个shell内置的,考虑到他们适应管道shell内建命令。

    请注意,有时当您像使用真正的程序一样使用内置的 shell 时,会发生的情况是运行同名的真实程序。但是没有单独的程序cd,我们可以 cd; 例如,运行cd blah 2>&1 | less;如果blah不存在或不是目录,您将能够在less.

最后,考虑cd $(tail -n 1 ~/mloc). 这个命令:

  • 运行tail -n 1 ~/mloc并捕获其输出。
  • 不是显示输出,而是构造一个由它附加到cd .
  • 运行该命令。