我正在运行一些脚本,这些脚本的命令cat
流水线如下grep
:
cat file.txt | grep "pattern"
大多数时候没有问题。但有时我会得到以下错误:
猫:写入错误:管道破损
那么我如何找出命令何时导致此问题以及原因?
原因是当管道仍有一些数据要从cat
读取时,管道被grep
关闭。信号SIGPIPE
被猫捕获并退出。
管道中通常发生的情况是 shell 在一个进程中运行cat
,在另一个进程中grep
运行。cat
的标准输出连接到管道的写端,grep
的标准输出连接到读取端。发生的事情是grep
命中了一个不存在的模式搜索并立即退出,导致管道的读取端关闭,cat
不喜欢这样做,因为它有更多的数据要写出到管道中。由于写入操作发生在另一端已关闭的另一个操作上,因此SIGPIPE
被它立即退出的cat
捕获。
对于这种微不足道的情况,您可以完全删除管道用法,并在文件的内容通过可以从中读取的 stdin grep
可用时grep "pattern" file.txt
运行它。
你可以像这样只使用没有管道的 grep
:grep "pattern" file.txt
我认为最好解决这个问题