管道和重定向都存在于shell中

时间:2014-07-01 01:33:03

标签: shell pipe io-redirection

如何解释cat /etc/passwd | cat </etc/issue的输出?

在这种情况下,第二个cat/etc/passwd收到$STDIN的内容,并再次/etc/issue被重定向。为什么只剩下/etc/issue

除此之外,cat </etc/passwd </etc/issue仅输出/etc/issue中的内容。是/etc/passwd是否被覆盖?

我不是在寻找如何cat两个文件的解决方案,而是与pipeline的工作方式相混淆。

2 个答案:

答案 0 :(得分:3)

管道和重定向从左到右处理。

首先,cat的输入被重定向到管道。然后将其重定向到/etc/issue。然后使用最后一个重定向运行程序,即文件。

执行cat <file1 <file2时,首先将stdin重定向到file1,然后将其重定向到file2。然后程序运行,它从最后一次重定向获得输入。

它就像变量赋值。如果你这样做:

stdin=passwd
stdin=issue

最后stdin的值是指定的最后一个值。

bash文档在Redirection部分的第一段中对此进行了解释:

  

在执行命令之前,可以使用shell解释的特殊表示法对其输入和输出进行重定向。重定向还可用于打开和关闭当前shell执行环境的文件。以下重定向运算符可以在简单命令之前或出现在任何位置,也可以跟随命令。重定向按其显示的顺序处理,从左到右

(强调我的)。我假设它也在POSIX shell规范中,我还没有费心去查找它。这就是Unix shell一直表现的方式。

答案 1 :(得分:0)

首先创建管道:cat /etc/passwd的标准输出被发送到管道的写入侧,cat </etc/issue的标准输入被设置为管道的读取侧。然后处理每一半管道上的命令。 LHS上没有其他I / O重定向,但在RHS上,标准输入被重定向,因此它来自/etc/issue。这意味着实际上没有读取管道的读取端,因此LHS cat以SIGPIPE终止(可能;或者,它将数据写入管道但没有进程读取它)。 LHS cat从不知道管道输入 - 它只有标准输入的文件输入。