我有以下一系列命令:
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
来自管道的命令,因为其他命令都不想使用它。