stdin/stdout 与子 shell 和 cd 命令结合使用的行为

stdin/stdout 与子 shell 和 cd 命令结合使用的行为

我有以下一系列命令:

cd / && ls | ( cd /tmp && cat >dumpfile)

这一系列命令执行以下操作:创建一个名为/tmp/dumpfile.该文件包含根目录的列表。

输出cd / && ls通过管道传输到子 shell。我发现了什么奇怪的是在子 shell 中,不是 cd /tmp吞掉ls输出,而是稍后cat >dumpfile获取它并将其写入文件。这里发生了什么?

答案1

管道设置标准输出以从ls子 shell 开始。

在子shell中,cd /tmpcat是在同一个进程中完成的。

cd /tmp不从标准输入(管道)读取,因此当cat从标准输入读取时,它会获取所有的ls输出。

答案2

cd不会吞咽输出,因为它不想这样做。考虑一下:

{ ls; date; } | (cd /tmp && date >> date.txt && cat date.txt && cat >dumpfile)

只有最后一个命令cat >dumpfile会保存stdin来自管道的命令,因为其他命令都不想使用它。

相关内容