为什么我不能将一个命令的路径名输出重定向到“cd”?

Jho*_*han 29 shell pipe io-redirection cd-command

我试图cd接受从另一个命令重定向到它的目录名称。这些方法都不起作用:

$ echo $HOME | cd
$ echo $HOME | xargs cd
Run Code Online (Sandbox Code Playgroud)

这确实有效:

$ cd $(echo $HOME)
Run Code Online (Sandbox Code Playgroud)

为什么第一组命令不起作用,还有其他命令也会以这种方式失败吗?

D_B*_*Bye 35

cd不是外部命令 - 它是一个 shell 内置函数。它在当前 shell 的上下文中运行,而不是像外部命令那样,在 fork/exec 的上下文中作为一个单独的进程运行。

您的第三个示例有效,因为 shell 在调用cd内置函数之前扩展了变量和命令替换,因此它cd接收的值${HOME}作为其参数。

POSIX 系统确实有一个二进制文件cd——在我的 FreeBSD 机器上,它位于/usr/bin/cd,但它并没有像你想象的那样。调用二进制文件cd会导致 shell 派生/执行二进制文件,这确实将其工作目录更改为您传递的名称。但是,一旦它这样做,二进制文件就会退出,并且分叉/执行的进程消失,将您返回到您的 shell,它仍然在您开始之前所在的目录中。

  • 这让人想知道[外部`cd`命令有什么意义?](http://unix.stackexchange.com/questions/50058/what-is-the-point-of-the-cd-external-binary ) (10认同)

mou*_*iel 23

cd不读取标准输入。这就是为什么你的第一个例子不起作用。

xargs需要一个命令名,即一个独立的可执行文件的名称。cd需要是一个 shell 内置命令,如果它是一个可执行文件,则没有任何效果(除了验证您可以更改到该目录以及它可能对自动挂载目录产生的潜在副作用之外)。这就是为什么你的第二个例子不起作用。