让我们考虑一下:
cat > outout.txt | cat > outout2.txt
我不知道如何解释这样的事情。第二个命令的输入是什么?
答案 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,似乎>
重定向的优先级高于管道。