" cat a |猫b"忽略

时间:2016-07-08 19:23:47

标签: linux bash pipe

管道的正式定义表明左侧文件的STDOUT将立即通过管道传送到正确文件的STDIN。我有两个文件hello.txthuman.txtcat hello.txt会返回Hellocat human.txt会返回I am human。现在,如果我cat hello.txt | cat human.txt,则不应该返回Hello I am human吗?相反,我&# 39;我看到command not found。我是shell脚本的新手。有人可以解释一下吗?

3 个答案:

答案 0 :(得分:8)

背景:管道在左侧安排输出命令(即写入FD 1,stdout的内容)作为输入传递给右侧的命令(在FD 0,stdin上)。它通过使用" pipe"或FIFO连接进程并同时执行它来完成此操作;尝试从FIFO读取将等到另一个进程写入内容,并且尝试写入FIFO将等到另一个进程准备好读取。

hello.txt

...将cat human.txt的内容提供给cat human.txt的标准输入,但 human.txt无法从其标准输入中读取;相反,它的命令行参数指向只读cat human.txt

因此,cat hello.txt的stdin上的内容被忽略且永远不会被读取,cat human.txtcat hello.txt | cat - human.txt 退出时收到SIGPIPE,然后退出。

cat

...相比之下,第二个/dev/stdin将首先从stdin读取(您也可以在许多操作系统(包括Linux)上使用-代替{{1}}),然后从一个文件。

答案 1 :(得分:0)

你不需要管道它们而不是你可以从下面的多个文件中读取,这将反过来连接两个文件内容的内容

cat hello.txt human.txt

|通常在您想要将第一个命令的输出提供给管道中的第二个命令时使用。在这种情况下,特别是您的第二个命令是从文件读取,因此不需要通过管道传输。如果你想,你可以这样做

echo "Hello" | cat - human.txt

答案 2 :(得分:0)

该命令首先不会出现错误,它会打印出来的人,即human.txt的内容

是的,您对管道定义是正确的,但在管道的右侧应该有一些命令。 如果该命令用于接收输入并提供输出,则它将为您提供输出,否则命令将执行其自己的行为

但是这里有一个命令,即右侧的cat human.txt,但是它会打印自己的内容并且不会对收到的输入进行操作。

当你写的时候也会出现这个错误 cat hello.txt | human.txt bash会给你这个错误: human.txt:找不到命令