我的问题是,当cd位于管道的开头或中间时,为什么cd的行为与bash的行为方式相同。
当我付出时 cd | ls,它仍然打印父目录中的文件,基本上有效,它会忽略cd命令。
为什么在csh中没有以这种方式实现 当我给cd | ls,它应该cd到home directoy并在该目录上应用ls。当控制返回到shell时,它应该保留shell运行时的旧值pwd。 即管道中的cd应该使用已更改的目录来执行cd命令右侧的所有命令。
我在这里错过了一些基本的设计原则吗?
答案 0 :(得分:4)
你确实错过了一个基本的设计原则。
通常,当您启动一个进程时,它有自己的“环境”,包括所有环境变量和当前工作目录。进程所做的任何更改都仅限于该进程及其子进程。实际上这是非常可取的,想象一下,如果进程可能影响他们的兄弟姐妹,甚至更糟糕的是他们的父母,那么可能会出现混乱。
当你有管道时,你有一个父,你在其中指定了一个管道的shell和一些所有“管道”在一起的孩子,每个孩子都有一个独立的环境。
一旦理解了这一点,就可以很容易地处理事情并更改父目录中的目录。
(cd /etc && ( ls | grep x))
这里整个事情都在()中,因此它在子进程中运行,因此cd不会影响当前的shell,但会影响在(grand-)子进程中运行的管道。
答案 1 :(得分:1)
因为那不是管道的用途。它们用于指导输入/输出,而不是控制shell的状态。
如果您想要描述的行为,请使用子shell:
( cd ; ls )