Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Eviter les messages d'erreur "Broken pipe"

7 réponses
Avatar
Vincent Lefevre
Bonjour,

J'aimerais savoir comment éviter les messages d'erreur "Broken pipe"
d'utilitaires que je n'ai pas écrits (et que je ne peux/veux pas
modifier). Par exemple:

svn log | head

donne un message d'erreur:

svn: Write error: Broken pipe

Ce genre de message d'erreur est particulièrement ennuyeux dans le
cas suivant:

script | head

où script exécute le "svn log" et récupère le résultat par pipe.
Dans ce cas, j'obtiens le message d'erreur après l'affichage du
prompt.

À noter que "cat" n'a pas ce problème: il est simplement tué par le
signal SIGPIPE, donc pas de message sur stderr et l'utilisateur peut
utiliser l'exit status pour connaître la cause du problème, e.g. sous
zsh:

$ svn log | cat | head -1
------------------------------------------------------------------------
svn: Write error: Broken pipe
$

ou

$ svn log | cat | head -1
------------------------------------------------------------------------
svn: Write error: Broken pipe
zsh: exit 1 svn log |
zsh: broken pipe cat |
zsh: done head -1
$

suivant la config de zsh. Dans le 2e cas, j'aurais aimé obtenir:

$ svn log | cat | head -1
------------------------------------------------------------------------
zsh: broken pipe svn log |
zsh: broken pipe cat |
zsh: done head -1
$

--
Vincent Lefèvre <vincent@vinc17.org> - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)

7 réponses

Avatar
Stephane Chazelas
2008-04-17, 22:21(+00), Vincent Lefevre:
[...]
J'aimerais savoir comment éviter les messages d'erreur "Broken pipe"
d'utilitaires que je n'ai pas écrits (et que je ne peux/veux pas
modifier). Par exemple:

svn log | head

donne un message d'erreur:

svn: Write error: Broken pipe
[...]


Evite le SIGPIPE:

svn log | sed '1,10!d'

--
Stéphane

Avatar
Vincent Lefevre
Dans l'article ,
Stephane Chazelas écrit:

Evite le SIGPIPE:

svn log | sed '1,10!d'


Cette solution ne me convient pas pour des raisons d'efficacité:
le "svn log" complet peut prendre énormément de temps (plusieurs
dizaines de secondes, voire plusieurs minutes), alors que je n'ai
besoin que des premières lignes.

Note: je préfère éviter l'utilisation de l'option --limit de
"svn log", qui se base sur le nombre d'entrées et non sur le
nombre de lignes.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)

Avatar
Jacques L'helgoualc'h
Le 18-04-2008, Vincent Lefevre a écrit :
Stephane Chazelas écrit:

Evite le SIGPIPE:

svn log | sed '1,10!d'


Cette solution ne me convient pas pour des raisons d'efficacité:
le "svn log" complet peut prendre énormément de temps (plusieurs
dizaines de secondes, voire plusieurs minutes), alors que je n'ai
besoin que des premières lignes.


Est-ce que « sed 10q » convient mieux ?
--
Jacques L'helgoualc'h


Avatar
Matthieu Moy
Jacques L'helgoualc'h <lhh+ writes:

Le 18-04-2008, Vincent Lefevre a écrit :
Stephane Chazelas écrit:

Evite le SIGPIPE:

svn log | sed '1,10!d'


Cette solution ne me convient pas pour des raisons d'efficacité:
le "svn log" complet peut prendre énormément de temps (plusieurs
dizaines de secondes, voire plusieurs minutes), alors que je n'ai
besoin que des premières lignes.


Est-ce que « sed 10q » convient mieux ?


On en revient au problème initial : svn rale sur un « broken pipe ».
Je ne crois pas qu'il y ait de solution autre que de patcher svn ...

--
Matthieu



Avatar
Paul Gaborit
À (at) Fri, 18 Apr 2008 12:06:03 +0200,
Matthieu Moy écrivait (wrote):
Jacques L'helgoualc'h <lhh+ writes:

Le 18-04-2008, Vincent Lefevre a écrit :
Stephane Chazelas écrit:

Evite le SIGPIPE:

svn log | sed '1,10!d'


Cette solution ne me convient pas pour des raisons d'efficacité:
le "svn log" complet peut prendre énormément de temps (plusieurs
dizaines de secondes, voire plusieurs minutes), alors que je n'ai
besoin que des premières lignes.


Est-ce que « sed 10q » convient mieux ?


On en revient au problème initial : svn rale sur un « broken pipe ».
Je ne crois pas qu'il y ait de solution autre que de patcher svn ...


Et en redirigeant la sortie d'erreur de svn vers /dev/null ?

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>




Avatar
Vincent Lefevre
Dans l'article ,
Matthieu Moy écrit:

On en revient au problème initial : svn rale sur un « broken pipe ».
Je ne crois pas qu'il y ait de solution autre que de patcher svn ...


Je viens de voir qu'un bug a finalement été rapporté:

http://subversion.tigris.org/issues/show_bug.cgi?id014

D'ailleurs, comme indiqué dans le rapport de bug, le problème avait
déjà été mentionné plusieurs fois dans la liste de développement
(dont par moi-même).

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)

Avatar
Vincent Lefevre
Dans l'article ,
Paul Gaborit écrit:

Et en redirigeant la sortie d'erreur de svn vers /dev/null ?


Je ne veux pas ignorer les autres messages d'erreur éventuels.

Une solution serait peut-être d'écrire un wrapper pour récupérer
la sortie d'erreur de svn et filtrer le message indiquant un
broken pipe uniquement, avec les inconvénients que cela pose:
problèmes éventuels de bufferisation ou de "désynchronisation"
entre stdout et stderr, et prise en compte des traductions.

En fait, dans mon cas, j'ai déjà un wrapper qui reformate la sortie
de "svn log" (cf mon premier message), mais ça le complique encore
plus, car cette fois, il faut également que je trappe SIGPIPE dans
mon wrapper. D'ailleurs, pour éviter le message d'erreur de svn
après le prompt, il vaut mieux que je le fasse, afin d'être sûr que
mon wrapper termine après svn.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)