ken*_*enn 4 bash gnome-terminal bashrc
我运行的是 Ubuntu 14.04.3,它是最新的。我不知道为什么,几天来我开始收到grep: write error: Broken pipe
有关启动gnome-terminal 的消息。这似乎无害,但它让我烦恼。我该如何调试它?
编辑:我将别名和函数分别移动到单独的文件,例如.bash_aliases
和.bash_functions
并添加了一个命令来加载它们.bashrc
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
if [ -f ~/.bash_functions ]; then
. ~/.bash_functions
fi
Run Code Online (Sandbox Code Playgroud)
如果我不加载.bash_functions
问题就会消失。
我试图通过一一禁用每个功能来找到有问题的功能。
这个给了我同样的错误,但是当我禁用它时,我不断收到相同的错误,所以我可能有更多错误的功能。
ls -lt $PWD| grep ^d | head -1 | cut -b 51-
grep: development
write error: Broken pipe
Run Code Online (Sandbox Code Playgroud)
我想知道为什么我开始犯这个错误。
编辑2:
我在这里发现了类似的问题管道损坏
问题的根源似乎也很相似。
我尝试了链接中给定的测试命令,但出现相同的错误:
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
Run Code Online (Sandbox Code Playgroud)
编辑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 身份验证模块之一。
这个超级用户答案对此问题有很好的解释:How can I fix a Broken Pipe error? 。
管道中的命令是异步运行的:这意味着在诸如之类的管道中,command1 | command2
不能保证command1
会在command2
.
使用时[...] | grep | head -n 1
,head
读完一行后立即结束;如果这种情况发生在grep
完成写入管道之前,grep
则会收到 SIGPIPE 信号并出错。
head
正如下面的超级用户答案中所解释的,解决方法是将管道中之前的输出通过管道传输到tail -n +1
第一个,这将忽略 SIGPIPE 信号:
command | tail -n +1 | head -n 1
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,甚至不需要head
,因为grep
可以选择仅打印第一个匹配项:
[...] | grep -m 1
Run Code Online (Sandbox Code Playgroud)