linux - 为什么我很少而不是总是得到 "cat: write error: Broken pipe"

标签 linux bash grep cat broken-pipe

我正在运行一些脚本,其中包含 catgrep 流水线化的命令,例如:

cat file.txt | grep "pattern"

大多数时候没有问题。但有时我会遇到以下错误:

cat: write error: Broken pipe

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

最佳答案

原因是管道在cat还有一些数据要读取时被grep关闭了。信号 SIGPIPE 被 cat 捕获并退出。

管道中通常发生的事情是 shell 在一个进程中运行 cat 并在另一个进程中运行 grepcat 的标准输出连接到管道的写入端,grep 的标准输入连接到读取端。发生的事情是 grep 命中了一个不存在的模式搜索并立即退出导致管道的读取端被关闭,这 cat 不喜欢,因为它有更多要写入管道的数据。由于写操作发生在另一个已经关闭的另一端,SIGPIPEcat 捕获并立即退出。

对于这种微不足道的情况,当文件内容通过 grep< 的标准输入可用时,您可以完全删除管道使用并将其作为 grep "pattern"file.txt 运行 它可以从中读取。

关于linux - 为什么我很少而不是总是得到 "cat: write error: Broken pipe",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49664991/

相关文章:

bash - Bash 中是否有一个钩子(Hook)可以查明 cwd 何时更改?

linux - bash echo 在 grep 什么都不返回后不起作用

linux - 如何根据在该文件上运行的命令的输出来搜索文件

linux - git:确定是否有文件不在 repo 协议(protocol)中,但应该添加

bash - ffmpeg 命令在 python 中使用时出错

ruby-on-rails - 使用一些参数运行 rails runner

awk - 根据另一个文件中的模式删除行

linux - 如何增加kafka集群上的打开文件

linux - Perl:带参数执行时为 "No such file or directory"

linux - headless 设备中的linux pactl卡列表,用于pulseaudio