为什么 cd 命令处理 STDIN 与其他命令不同?

Rof*_*ide 1 linux shell stdin

像这样的命令cd不能将输出通过管道传送到它们以更改目录——它们需要命令行参数。

为什么该cd命令(以及类似的命令,例如mv, cp, & rm)在读入时不像大多数其他命令那样起作用STDIN?阻止它读取标准输入以更改目录背后的逻辑是什么?

我能找到的最佳答案指出:

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

然而,对我来说,上面的答案根本没有真正解释它:为什么cd处理STDIN与许多其他读入的命令不同STDIN

jll*_*gre 7

读取的命令stdin几乎都属于过滤器系列,即将文本数据流转换为转换后的数据流的程序。

cat, sed, awk,gzip甚至sh是这种“过滤器”的好例子。

引用的命令cpmvrm绝对不是过滤器,但该命令一起做事的参数传递,这里的文件或目录。

cd命令与它们类似,它需要一个参数(如果未提供则模拟默认参数),并且通常不会在 上输出任何内容stdout,尽管在某些情况下它可能会输出一些内容,例如使用CDPATH.

即使有人想创建一个cd是采取目标目录从标准输入变种,它不会有任何效果在Bourne shell的管道使用时,dashbash仅举几例。命令的最后一个组件在子 shell 中运行,对新目录的更改不会影响当前 shell。例如:echo /tmp | cd将与ksh93但不与bash, dash, zsh, sh, ...

cd <(echo /tmp)将与支持进程替换的 shell 一起使用(至少ksh, bash, zsh),但与cd $(echo tmp)

唯一可能感兴趣的用例是:

echo tmp | (cd ; pwd)
Run Code Online (Sandbox Code Playgroud)

最后,这样的变体需要解决没有参数但预期行为是将目录更改为用户的主目录的情况,或者没有参数但预期行为是从中读取目标目录的名称标准输入。由于没有可靠的方法来决定,这是注定的。


归档时间:

查看次数:

1446 次

最近记录:

9 年,9 月 前