cd命令在pipe道中的行为

我的问题是,为什么当cd在pipe道的开始或中间,cd的行为方式是bash的行为。

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

为什么在csh中没有以这种方式实现:当我给CD | ls,它应该cd到homeoy,并在该目录上应用ls。 当控制权返回到shell时,它应该保留运行shell的旧的pwd值。 即pipe道中的cd应该使用cd命令右侧的所有命令的已更改目录。

我在这里错过了一些基本的devise原则吗?

你确实错过了一个基本的设计原则。

一般来说,当你启动一个进程时,它有自己的“环境”,包括所有的环境变量和当前的工作目录。 该流程所做的任何更改仅限于该流程及其子项。 实际上,这是非常可取的,想象如果进程可能影响他们的兄弟姐妹,甚至更糟的是,他们的父母可能会发生混乱。

当你有管道的时候,你有一个父节点,在其中你指定了一个管道的管道和许多孩子一起“管道”在一起,每个孩子都有一个独立的环境。

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

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

这里整个事情是in(),以便它在一个子进程中运行,因此cd不会影响当前的shell,但会影响在(grand-)子进程中运行的管道。

因为这不是什么管道。 它们用于指导输入/输出,而不是控制shell的状态。

如果你想要描述的行为,使用一个子shell:

 ( cd ; ls )