gnome-terminal começa com a mensagem “grep: write error: Broken pipe”

3

Estou executando o Ubuntu 14.04.3, está atualizado. Não sei por que, por alguns dias, comecei a receber a mensagem grep: write error: Broken pipe ao lançar o gnome-terminal . Parece ser inofensivo, mas isso me incomoda. Como posso depurar isso?

EDIT: Mudei aliases e funções para separar arquivos como .bash_aliases e .bash_functions e adicionei um comando para carregá-los de .bashrc

 if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
 fi

 if [ -f ~/.bash_functions ]; then
. ~/.bash_functions
 fi

Se eu não carregar o problema .bash_functions desaparecerá.

Estou tentando encontrar a falha, desabilitando cada função uma por uma.

Este me dá o mesmo erro, mas quando eu desabilito eu continuo recebendo o mesmo erro, então eu posso ter mais funções defeituosas.

 ls -lt  $PWD| grep ^d | head -1 | cut -b 51- 

 grep:  development
 write error: Broken pipe

Eu me pergunto por que comecei a ter esse erro.

EDIT2:

Encontrei um problema semelhante aqui tubo boken

A raiz do problema também parece semelhante.

Eu tentei o comando test dado no link que tem o mesmo erro:

 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

EDIT3:

Embora a unbuffer de solução de problemas que publiquei abaixo como uma resposta às minhas próprias perguntas funcione, não estou satisfeito com ela, mas meu conhecimento sobre depuração é limitado. De acordo com este link link , ele vem da armadilha do SIGPIPE por outra tarefa, e este link link indica a causa exata do problema, é um do módulo de autenticação pam que eu estou com problemas com isso recentemente.

    
por kenn 14.02.2016 / 13:04

2 respostas

3

Depois de horas lutando com o problema, encontrei uma solução alternativa (espero que sim)

O problema parece ser mais profundo e complicado. Muitas pessoas encontraram o mesmo erro. Consertar isso está além da minha cobertura.

A solução mais próxima publicada aqui how-can-i-fix-a -broken-pipe-error por Andrew Beals no final como:

ls -lt $PWD|dd obs=1M | grep -m 1 ^d | cut -b 51-

não é legal.

Quando intuí que está relacionado ao buffer de pipe, dei uma chance ao comando unbuffer como:

 unbuffer ls -lt $PWD| grep -m 1 ^d | cut -b 51-

Funciona bem.

Espero que alguém ponha a causa real do problema.

EDIT: Um Guru bash sugeriria esta solução simples, redirecionando stderr para /dev/null

 ls -lt $PWD 2>/dev/null | grep -m 1 ^d | cut -b 51-
    
por kenn 15.02.2016 / 23:58
2

Há uma ótima explicação para esse problema nesta resposta do Super User: Como posso corrigir um erro de Broken Pipe? .

Os comandos nos canais são executados de forma assíncrona: isso significa que, em um canal como command1 | command2 , não há garantia de que command1 terminará antes de command2 .

Ao usar [...] | grep | head -n 1 , head termina assim que tiver lido uma linha; se isso acontecer antes de grep terminar de gravar no pipe, grep receberá um sinal SIGPIPE e erros.

Como explicado na resposta abaixo que Super User answer, uma solução é canalizar a saída do que está antes de head no pipeline para tail -n +1 first, o que irá ignorar o sinal SIGPIPE:

command | tail -n +1 | head -n 1

Mas, neste caso, não há necessidade de head , pois grep tem a opção de imprimir apenas a primeira correspondência:

[...] | grep -m 1
    
por kos 14.02.2016 / 19:57