Por que o Subversion fornece um erro de cano quebrado quando canalizado na cabeça?

6

Se eu fizer um

svn log | head

após a décima linha de saída, recebo uma mensagem de erro:

svn: Write error: Broken pipe

O que está acontecendo aqui? Eu não vi nenhum outro comando fazer isso quando usado com head . Subversão é hostil ao paradigma de filtragem do Unix?

    
por Kazark 04.01.2013 / 00:44

2 respostas

9

Quando você escreve em um tubo cuja outra extremidade foi fechada, você normalmente recebe um sinal SIGPIPE e morre. No entanto, se você optar por ignorar esse sinal, como svn , em vez disso, o write retornará com -1 e errno definido como EPIPE cuja tradução em inglês será "Broken pipe". E svn escolhe exibir essa mensagem de erro quando falhar em gravar algo em sua saída padrão.

head termina depois de ter escrito 10 linhas de sua entrada e, como resultado, fecha o canal. svn não poderá mais escrever nesse pipe. A maioria das aplicações morre silenciosamente como o comportamento padrão quando não está ignorando o SIGPIPE. svn por algum motivo (talvez porque precise fazer coisas extras antes de morrer) opta por ignorar o SIGPIPE e determinar que ele não pode mais escrever no pipe verificando o status de erro do write para o pipe. / p>

Você recebe o mesmo erro com:

bash -c 'trap "" PIPE; while echo foo; do :;done' | head

Veja:

strace -e write seq 10000 | head

(no Linux) para ver qual é o comportamento padrão quando você não está ignorando o SIGPIPE.

    
por 04.01.2013 / 01:31
5

Esta é uma questão de longa data do Subversion (primeiro levantada em 2007 e não corrigida até 2011). As razões para os desenvolvedores svn não consertá-lo por tanto tempo não são totalmente claras, mas você pode ler todos os detalhes, incluindo os isso foi corrigido em 1.7.0 , no relatório de bug vinculado. Então, se esse comportamento é realmente um problema para você, então verifique sua versão do cliente svn ( svn --version ), e considere atualizar ...

    
por 04.01.2013 / 04:25