# Broken pipe

## glockenstein

Hallo Forum!

Wenn ich den Befehl

  # equery list | head -n 5

eingebe, bekomme ich folgendes Ergebnis:

  * installed packages

 app-admin/eselect-1.0.7

 app-admin/eselect-oodict-20060706

 app-admin/eselect-opengl-1.0.5

 app-admin/eselect-vi-1.1.4

 Traceback (most recent call last):

   File "/usr/bin/equery", line 1733, in ?

     cmd.perform(local_opts)

   File "/usr/bin/equery", line 1361, in perform

     self._print_installed(matches, rx)

   File "/usr/bin/equery", line 1417, in _print_installed

     matches, rx, 1)

   File "/usr/bin/equery", line 1397, in _generic_print

     print_info(0, pkg.get_cpv())

   File "/usr/lib/gentoolkit/pym/gentoolkit/pprinter.py", line 20, in print_info

     sys.stdout.write(s)

 IOError: [Errno 32] Broken pipe

Ist diese Fehlermeldung vermeidbar? Optionen -q und -C helfen leider nicht.

Interessanterweise geht es mit

  # equery list 2>&1 | head -n 5

aber das kann ja nicht die Lösung sein ...

Gruß Micha

----------

## tacki

Der Grund ist ganz einfach:

equery will etwas ausgeben, und es gibt keinen 'reader' mehr im pipe, da head nach 5 zeilen dicht macht. das ergebnis ist ein SIGPIPE-Error, der equery zum absturz bringt.

siehe auch hier:

http://www.unixguide.net/unix/bash/E2.shtml

Eventuell gibts aber eine andere Lösung für dein ursprüngliches Problem? Was willst du denn genau erreichen?

----------

## glockenstein

 *tacki wrote:*   

> Der Grund ist ganz einfach:
> 
> equery will etwas ausgeben, und es gibt keinen 'reader' mehr im pipe, da head nach 5 zeilen dicht macht. das ergebnis ist ein SIGPIPE-Error, der equery zum absturz bringt.
> 
> ..
> ...

 

Nun ja, es gibt kein ursprüngliches Problem. Mir ist bei irgendeinem Kommando aufgefallen, daß tail eine

Zeile weniger liefert als gewünscht. Habe vergessen was das war. Habe dann mit head und tail getestet,

was es gewesen sein könnte und bin dabei auf diese Merkwürdigkeit gestoßen.

Ich dachte, es könnte ein Fehler in equery sein. Habe nur ich diesen Absturz?

Gruß Micha

----------

## tacki

Nein, das ist ein logischer Error in /bin/bash. Wird bei jedem auftreten, der die standard-bash verwendet... ka wie es bei den Alternativen wie zsh etc. aussieht.

----------

## hurra

 *tacki wrote:*   

> Nein, das ist ein logischer Error in /bin/bash. Wird bei jedem auftreten, der die standard-bash verwendet... ka wie es bei den Alternativen wie zsh etc. aussieht.

 

zsh bringt den gleichen Fehler  :Smile: 

----------

## glockenstein

 *tacki wrote:*   

> Nein, das ist ein logischer Error in /bin/bash. Wird bei jedem auftreten, der die standard-bash verwendet... ka wie es bei den Alternativen wie zsh etc. aussieht.

 

Gefunden auf www.gnu.org:

As of bash-3.1, bash does not report SIGPIPE errors by default.  You

can build a version of bash that will report such errors.

Installiert habe ich aber doch 3.1_p17. Eventuell ist da etwas mit dem Gentoo-Patch

bash-3.0-trap-fg-signals.patch nicht okay?

Gruß Micha

----------

## Mr. Anderson

Du kannst es umgehen mit sed (oder natürlich auch anderen Editoren)

```
equery list | sed -e'1,5!d'
```

----------

## mv

 *glockenstein wrote:*   

> As of bash-3.1, bash does not report SIGPIPE errors by default.
> 
> Eventuell ist da etwas mit dem Gentoo-Patch [...] nicht okay?

 

Ist doch alles in Ordnung: Die Bash meldet den Fehler ja auch nicht, das macht Python. Mit 

```
eix -c | head -n 5
```

 sieht man keine solche Meldung.

----------

## glockenstein

 *mv wrote:*   

>  *glockenstein wrote:*   As of bash-3.1, bash does not report SIGPIPE errors by default.
> 
> Eventuell ist da etwas mit dem Gentoo-Patch [...] nicht okay? 
> 
> Ist doch alles in Ordnung: Die Bash meldet den Fehler ja auch nicht, das macht Python. Mit 
> ...

 

Es ging um equery. Aber interessant: Habe jetzt einfach mal equery list -c eingetippt.

Dann geht es. Diese lokale Option wird bei equery list --help gar nicht angezeigt.

Was bewirkt diese Option und warum ist sie nicht dokumentiert?

Trotzdem bleibt die Frage, weshalb bash einen SIGPIPE error meldet, obwohl es das nicht sollte

laut Dokumentation. Und das finde ich nicht in Ordnung  :Wink: 

Gruß Micha

----------

## glockenstein

 *glockenstein wrote:*   

> 
> 
> Es ging um equery. Aber interessant: Habe jetzt einfach mal equery list -c eingetippt.
> 
> Dann geht es. Diese lokale Option wird bei equery list --help gar nicht angezeigt.
> ...

 

Unsinn ich schrieb. Er suchte nach "-c" und fand weniger als 5 Zeilen.

Klar das es dann geht ...

----------

## mv

 *glockenstein wrote:*   

>  *mv wrote:*   Die Bash meldet den Fehler ja auch nicht, das macht Python. 
> 
> Trotzdem bleibt die Frage, weshalb bash einen SIGPIPE error meldet

 

 :Question: 

----------

## glockenstein

 *mv wrote:*   

>  *glockenstein wrote:*    *mv wrote:*   Die Bash meldet den Fehler ja auch nicht, das macht Python. 
> 
> Trotzdem bleibt die Frage, weshalb bash einen SIGPIPE error meldet 
> 
> 

 

Lies bitte noch mal in meinen Beitrag oben:

Gefunden auf www.gnu.org:

As of bash-3.1, bash does not report SIGPIPE errors by default. You

can build a version of bash that will report such errors.

Offenbar stürzt equery/python aber ab, weil eben doch ein SIGPIPE error geliefert wird!

Oder?

----------

## mv

 *glockenstein wrote:*   

> As of bash-3.1, bash does not report SIGPIPE errors by default.

 

Tut sie ja auch nicht. Zur Verdeutlichung habe ich ja das eix-Beispiel angegeben. Dass ein spezielles Programm (hier vermutlich: der Python-Interpreter) trotzdem feststellen kann, dass die Ausgabepipe weg ist und einen Fehler bringt, ist ja eine andere Sache.

----------

## glockenstein

 *mv wrote:*   

>  *glockenstein wrote:*   As of bash-3.1, bash does not report SIGPIPE errors by default. 
> 
> Tut sie ja auch nicht. Zur Verdeutlichung habe ich ja das eix-Beispiel angegeben. Dass ein spezielles Programm (hier vermutlich: der Python-Interpreter) trotzdem feststellen kann, dass die Ausgabepipe weg ist und einen Fehler bringt, ist ja eine andere Sache.

 

Jetzt hab ich es kapiert. Ich habe die ganze Zeit angenommen, daß die bash auch keinen SIGPIPE error generieren

sollte, der python zum Absturz bringt. Und das mit eix, dachte ich, wäre eine Verwechslung gewesen.

Habe inzwischen einige Webseiten zu dem Thema SIGPIPE und python gelesen und deshalb dem Entwickler von

equery eine Mail geschrieben und gebeten, er möge ein "signal.signal(signal.SIGPIPE, signal.SIG_DFL)" in sein

Script aufnehmen. Mal sehen, was er schreibt.

Gruß, Micha.

----------

