我正在运行 Ubuntu 14.04.3,它是最新的。我不知道为什么,这几天我开始收到grep: write error: Broken pipe
有关启动gnome-terminal 的消息。它似乎是无害的,但它困扰着我。我该如何调试它?
编辑:我将别名和函数分别移动到单独的文件中,例如.bash_aliases
and.bash_functions
并添加了一个命令来加载它们.bashrc
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
if [ -f ~/.bash_functions ]; then
. ~/.bash_functions
fi
如果我不加载.bash_functions
问题就会消失。
我试图通过一一禁用每个功能来找到有故障的功能。
这给了我同样的错误,但是当我禁用它时,我不断收到同样的错误,所以我可能有更多错误的功能。
ls -lt $PWD| grep ^d | head -1 | cut -b 51-
grep: development
write error: Broken pipe
我想知道为什么我开始犯这个错误。
编辑2:
我在这里发现了类似的问题boken pipe
问题的根源似乎也相似。
我在具有相同错误的链接中尝试了给定的测试命令:
bash -c '(while echo foo; do :; done); echo status=$? >&2' | head
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
bash: line 0: echo: write error: Broken pipe
status=0
编辑3:
尽管unbuffer
我在下面发布的作为我自己问题的答案的解决方法有效,但我对此并不满意,但我对调试的了解有限。根据此链接https://lists.gnu.org/archive/html/bug-coreutils/2007-11/msg00080.html它源于另一个任务的 SIGPIPE 陷阱,而此链接 https://lists.gnu.org /archive/html/bug-coreutils/2007-11/msg00154.html 指出了问题的确切原因,它是我最近遇到问题的 pam 身份验证模块之一。
这个超级用户的回答对这个问题有很好的解释:如何修复断管错误?.
管道中的命令是异步运行的:这意味着在诸如管道之类的管道中
command1 | command2
不能保证command1
会在command2
.使用时
[...] | grep | head -n 1
,head
读完一行就结束;如果在grep
完成对管道的写入之前发生这种情况,则会grep
收到 SIGPIPE 信号并出错。正如下面的超级用户回答中所解释的,一种解决方法是将管道中之前的输出
head
通过管道传输到tail -n +1
第一个,这将忽略 SIGPIPE 信号:但在这种情况下,甚至不需要
head
,因为grep
可以选择仅打印第一个匹配项:经过数小时的努力,我找到了一个可行的解决方法(我希望如此)
问题似乎更深更复杂。许多人遇到了同样的错误。修复它超出了我的范围。
Andrew Beals 在此处发布的最接近的解决方法how-can-i-fix-a-broken-pipe-error如下:
不整齐。
当我直觉它与管道缓冲区有关时,我给了一个
unbuffer
命令,例如:它运作良好。
我希望有人发布问题的真正原因。
编辑: bash Guru 会建议这个简单的解决方案,将 stderr 重定向到
/dev/null