我们来考虑一下:
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
。