linux - cd 命令在管道中的行为

标签 linux bash unix

我的问题是,当 cd 位于管道的开头或中间时,为什么 cd 的行为方式与 bash 的行为方式相同。

当我给 光盘 | ls,它仍然打印父目录中的文件,基本上是有效的,它忽略了 cd 命令。

为什么在csh中不是这样实现的: 当我给 cd | ls,它应该 cd 到主目录并在该目录上应用 ls。当控制返回到 shell 时,它应该保留运行 shell 时的 pwd 的旧值。 即,管道中的 cd 应该为 cd 命令右侧的所有命令使用更改后的目录。

我是否遗漏了一些基本的设计原则?

最佳答案

您确实缺少基本的设计原则。

通常,当您启动一个进程时,它有自己的“环境”,包括所有环境变量和当前工作目录。该进程所做的任何更改仅限于该进程及其子进程。这实际上是非常可取的,想象一下如果过程可能影响到他们的 sibling ,甚至更糟,他们的 parent 可能会发生的困惑。

当你有管道时,你有一个父级,你在其中指定管道的外壳和许多子级都“通过管道”连接在一起,每个子级都有一个独立的环境。

一旦你理解了这一点,就很容易解决问题并更改父目录。

  (cd /etc && ( ls | grep x))

这里整个事情都在 () 中,因此它在子进程中运行,因此 cd 不会影响当前 shell,但会影响在(孙)子进程中运行的管道。

关于linux - cd 命令在管道中的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19374010/

相关文章:

java - 如何在java中读取在unix中声明的变量

android - 无法在android shell中执行shell脚本

linux - 我忘记了我的 ssh 密码

regex - 当区域重叠时,Sed 不会替换文件中的所有实例

c - C 中 shell 命令的历史命令。从哪里开始

linux - 如何在shell脚本中扩展变量?

c - 在 Linux 中使用重命名来安全地覆盖共享文件

linux - 使用 sed 从/etc/fstab 中删除条目

linux - 在 linux 中使用 bash 脚本合并两个文本文件

linux - 我的 Linux 系统无法识别主机名。我该如何解决?