gpt4 book ai didi

linux - "cat a | cat b"忽略a的内容

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:02 26 4
gpt4 key购买 nike

管道的正式定义指出左侧文件的 STDOUT 将立即通过管道传输到右侧文件的 STDIN。我有两个文件,hello.txthuman.txt cat hello.txt 返回 Hello 并且 cat human.txt 返回 I am human。现在如果我做 猫你好.txt | cat human.txt,不应该返回 Hello I am human?相反,我看到 command not found。我是 shell 脚本的新手。可以有人解释吗?

最佳答案

背景:管道将左侧命令的输出(即写入 FD 1,stdout 的内容)作为输入传递给右侧命令(在 FD 0,stdin)。它通过使用“管道”或 FIFO 连接进程并同时执行它们来做到这一点;尝试从 FIFO 读取将等到其他进程写入内容,尝试写入 FIFO 将等到其他进程准备好读取。


cat hello.txt | cat human.txt

...将 hello.txt 的内容提供给 cat human.txt 的标准输入,但是 cat human.txt 没有从它的标准输入中读取;相反,它的命令行参数指示它只从 human.txt 中读取。

因此,cat human.txt 的标准输入中的内容将被忽略且永远不会读取,并且 cat hello.txtcat human 时收到 SIGPIPE。 txt 退出,然后也退出。


cat hello.txt | cat - human.txt

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

关于linux - "cat a | cat b"忽略a的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38274012/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com