我不小心输入了
cd /tmp | tail
这当然不是我的意思。但令我惊讶的是,我当时并没有更改目录。为什么是这样?为了比较
cd /tmp > /tmp/foo
确实会导致目录更改,因此它不是每个 sé 的输出重定向。这里发生了什么?
我不小心输入了
cd /tmp | tail
这当然不是我的意思。但令我惊讶的是,我当时并没有更改目录。为什么是这样?为了比较
cd /tmp > /tmp/foo
确实会导致目录更改,因此它不是每个 sé 的输出重定向。这里发生了什么?
管道涉及子 shell,其中的一部分不在父 shell 中运行,因此不会影响该父 shell 进程的工作目录。这就是 ZSH 的行为方式:
请注意目录仅
cd
在管道中的最后一个命令时才更改;这是在父 shell 中运行的,因此能够更改该进程的工作目录。此功能的有用用途通常涉及显式子shell和在其中运行的命令:
也一定要对
cd
调用进行错误检查,而不是假设它有效,除非你喜欢rsync
输出到处喷/
,或者其他类似的假设混乱......