简单的外壳。混合管道和输出

时间:2015-09-21 13:22:36

标签: linux shell pipe

让我们考虑一下:

 cat > outout.txt | cat > outout2.txt 

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

3 个答案:

答案 0 :(得分:3)

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

cat > outout.txt

如果一切正常,则此命令不产生输出,因此命令链的第二部分无法输入outout2.txt:

cat > outout2.txt

因此完整的命令链使文件outout2.txt变为空:

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

但请注意,outout2.txt 获得一些输出,如果第一个" cat"调用生成输出。例如,如果无法修改outout.txt,我们将STDERR输出发送到STDOUT:

$ chmod a-w outout.txt
$ cat 2>&1 > outout.txt | cat > outout2.txt

然后outout.txt将为空,但以下文本将写入outout2.txt(消息的确切文本可能取决于您的shell - 我使用bash 3.2):

-bash: outout.txt: Permission denied

答案 1 :(得分:1)

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

答案 2 :(得分:1)

好吧,试试吧:

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

对于bash,似乎>重定向的优先级高于管道。