简单的shell。 混合pipe道和输出

我们来考虑一下:

cat > outout.txt | cat > outout2.txt 

我不知道如何解释这样的事情。 第二个命令的input是什么?

当cat没有收到文件名参数时,它从STDIN获取输入并将其发送到STDOUT,因此命令链第一部分的作用是将输入的内容(直到EOD)放到文件outout.txt中:

 cat > outout.txt 

如果一切正常,这个命令不产生任何输出,所以命令链的第二部分没有任何东西放在outout2.txt中:

 cat > outout2.txt 

所以文件outout2.txt在完整的命令链中是空的:

 $ cat > outout.txt | cat > outout2.txt 

但是请注意,如果第一个“cat”调用产生输出,outout2.txt 将会得到一些输出。 例如,如果outout.txt不能修改,我们发送STDERR输出到STDOUT:

 $ chmod aw outout.txt $ cat 2>&1 > outout.txt | cat > outout2.txt 

那么outout.txt将是空的,但下面的文本将被写入outout2.txt(消息的确切文本可能取决于你的shell – 我使用bash 3.2):

 -bash: outout.txt: Permission denied 

那么,让我们试试看:

 $ echo "hello" | cat > outout.txt | cat > outout2.txt $ cat outout.txt hello $ cat outout2.txt 

看来,对于bash, >重定向比管道有更高的优先级。

在处理输出重定向之前设置管道。 创建了两个子壳体,每个子壳体都从父级继承其文件。 第一个子shell的标准输出用作第二个子shell的标准输出。 但是,第一个cat不使用它继承的文件作为标准输出; 它使用outout.txt 。 因此,第二个cat的标准输入都不会写入任何内容,所以它在第一次读取时会检测到文件结束并退出,而不会向outout2.txt写入任何outout2.txt 。 第一个cat的标准输入按照预期被写入outout.txt