为什么我很少得到"cat:写错误:断管",而不是总是如此

Vis*_*Lia 4 linux bash grep broken-pipe cat

我正在运行一些脚本,在几个地方,我正在运行用grep管道化的猫,如:

cat file.txt | grep "pattern"
Run Code Online (Sandbox Code Playgroud)

大多数时候都没有问题.但有时我会得到

cat:写错误:管道坏了

那么如何找出导致此问题的cat命令以及原因?

Ini*_*ian 7

原因是管道grep在仍有一些数据要读取时关闭cat.信号SIGPIPE被猫抓住并退出.

通常在管道中发生的是shell cat在一个进程grep中运行而在另一个进程中运行.stdout cat连接到管道的写端和stdin grep到读端.发生grep了什么事情是一个模式搜索不存在并立即退出导致管道的读取结束,这cat是不喜欢的,因为它有更多的数据要写入管道.由于写入动作发生在另一端已被关闭的另一端,SIGPIPE因此被cat其立即退出.

对于这样一个简单的案例,您可以完全删除管道使用并运行它,就像grep "pattern" file.txt文件的内容通过grep它可以读取的stdin一样可用.

  • “进行了不存在的模式搜索”?没有读完到底,它怎么知道这一点呢?(我需要假设OP的*真实*用例是使用`grep -q`、`grep -n`或他们从问题中省略的另一个参数)。 (2认同)