![stdin/stdout 与子 shell 和 cd 命令结合使用的行为](https://linux22.com/image/24537/stdin%2Fstdout%20%E4%B8%8E%E5%AD%90%20shell%20%E5%92%8C%20cd%20%E5%91%BD%E4%BB%A4%E7%BB%93%E5%90%88%E4%BD%BF%E7%94%A8%E7%9A%84%E8%A1%8C%E4%B8%BA.png)
我有以下一系列命令:
cd / && ls | ( cd /tmp && cat >dumpfile)
这一系列命令执行以下操作:创建一个名为/tmp/dumpfile
.该文件包含根目录的列表。
输出cd / && ls
通过管道传输到子 shell。我发现了什么奇怪的是在子 shell 中,不是 cd /tmp
吞掉ls
输出,而是稍后cat >dumpfile
获取它并将其写入文件。这里发生了什么?
答案1
管道设置标准输出以从ls
子 shell 开始。
在子shell中,cd /tmp
和cat
是在同一个进程中完成的。
cd /tmp
不从标准输入(管道)读取,因此当cat
从标准输入读取时,它会获取所有的ls
输出。
答案2
cd
不会吞咽输出,因为它不想这样做。考虑一下:
{ ls; date; } | (cd /tmp && date >> date.txt && cat date.txt && cat >dumpfile)
只有最后一个命令cat >dumpfile
会保存stdin
来自管道的命令,因为其他命令都不想使用它。