管道中cd命令的行为

时间:2013-10-15 05:42:00

标签: linux bash unix

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

当我付出时 cd | ls,它仍然打印父目录中的文件,基本上有效,它会忽略cd命令。

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

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

2 个答案:

答案 0 :(得分:4)

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

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

当你有管道时,你有一个父,你在其中指定了一个管道的shell和一些所有“管道”在一起的孩子,每个孩子都有一个独立的环境。

一旦理解了这一点,就可以很容易地处理事情并更改父目录中的目录。

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

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

答案 1 :(得分:1)

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

如果您想要描述的行为,请使用子shell:

( cd ; ls )