gnome-terminal 以“grep:写入错误:管道损坏”消息开头

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 身份验证模块之一。

kos*_*kos 5

这个超级用户答案对此问题有很好的解释:How can I fix a Broken Pipe error?

管道中的命令是异步运行的:这意味着在诸如之类的管道中,command1 | command2不能保证command1会在command2.

使用时[...] | grep | head -n 1head读完一行后立即结束;如果这种情况发生在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)