如何解释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
的工作方式相混淆。
答案 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
从不知道管道输入 - 它只有标准输入的文件输入。