Why am I getting "cat: write error: Broken pipe" rarely and not always
Why am I getting "cat: write error: Broken pipe" rarely and not always
我是 运行 一些脚本,其命令 cat
与 grep
流水线化,例如:
cat file.txt | grep "pattern"
大部分时间都没有问题。但有时我会遇到以下错误:
cat: write error: Broken pipe
那么我如何找出命令导致此问题的时间以及原因?
原因是管道被grep
关闭,而它仍然有一些数据要从cat
读取。信号 SIGPIPE
被 cat 捕获并退出。
管道中通常发生的是一个进程中的 shell 运行s cat
和另一个进程中的 grep
。 cat
的 stdout 连接到管道的 write-end,grep
的 stdin 连接到读取端。发生的事情是 grep
命中了一个不存在的模式搜索并立即退出导致管道的读取端被关闭,cat
不喜欢它,因为它有更多的数据要写出管道。由于写操作发生在另一个已经关闭的另一端,SIGPIPE
被 cat
捕获并立即退出。
对于这种微不足道的情况,您可以完全删除管道使用,并 运行 当文件内容在 grep
的标准输入上可用时,将其作为 grep "pattern" file.txt
可以阅读。
您只能像这样使用没有管道的 grep :
grep "pattern" file.txt
我觉得还是解决这个问题比较好
我是 运行 一些脚本,其命令 cat
与 grep
流水线化,例如:
cat file.txt | grep "pattern"
大部分时间都没有问题。但有时我会遇到以下错误:
cat: write error: Broken pipe
那么我如何找出命令导致此问题的时间以及原因?
原因是管道被grep
关闭,而它仍然有一些数据要从cat
读取。信号 SIGPIPE
被 cat 捕获并退出。
管道中通常发生的是一个进程中的 shell 运行s cat
和另一个进程中的 grep
。 cat
的 stdout 连接到管道的 write-end,grep
的 stdin 连接到读取端。发生的事情是 grep
命中了一个不存在的模式搜索并立即退出导致管道的读取端被关闭,cat
不喜欢它,因为它有更多的数据要写出管道。由于写操作发生在另一个已经关闭的另一端,SIGPIPE
被 cat
捕获并立即退出。
对于这种微不足道的情况,您可以完全删除管道使用,并 运行 当文件内容在 grep
的标准输入上可用时,将其作为 grep "pattern" file.txt
可以阅读。
您只能像这样使用没有管道的 grep :
grep "pattern" file.txt
我觉得还是解决这个问题比较好