PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bash pipe: welcher exit code zurueckgegeben?



samsara
24-12-2003, 03:45
proggi1 | proggi2 || echo "error"

Frage: Wie werden die exit codes der pipe ausgewertet? Addition?

Danke,

Samsara
(smoking on his bash pipe)

peschmae
24-12-2003, 17:07
offenbar den error-code des letzten Programms:



For foreground pipes, it's impossible to get the exit code of any but
the last pipe (bad design). I'd also really like to know how to get the
exit codes of all of the earlier commands in the pipeline - otherwise
safe programming is not possible: an earlier command might make the sky
crash down, and bash happily reports "success" at the end of the
pipeline (doh, tcsh gets this right).


http://www.mail-archive.com/linux-users@it.canterbury.ac.nz/msg14697.html

Wers nicht glaubt (wie ich) kannst leicht selber ausprobieren. Als root (;) April April - nein, natürlich als normaler User! sonst gehts arg ins Auge)



cd
ls | rm -Rf /root || echo "errorli"
rm -Rf /root | ls || echo "errorli"


ersteres sagt "errorli" - weil "rm -Rf /root" fehlschlug, letzteres sagt nichts - der Output vom Kommando ist natürlich trotzdem zu sehen, weil nur der STDOUT weitergepiped wurde, der STDERR gelangt trotzdem auf die Konsole - aber "errorli" wird nicht ausgegeben.

Bedenklich.

MfG Peschmä

samsara
25-12-2003, 05:44
Workaround: erst in eine Datei umleiten, dann wieder auslesen, z.B.


ls *.jpg > suchfile.txt || echo "errorli"
grep portrait < suchfile.txt || echo "errorli"

Macht leider alles etwas langsamer :(

Gruss,

Samsara

peschmae
25-12-2003, 13:47
Ja, irgend ne wirklich schlaue Alternative fällt mir auch nicht ein.
Aber damit geht natürlich auch sonst noch das Verhalten der Pipe verloren (es command2 fängt schon an bevor command1 beendet wurde)

MfG Peschmä

samsara
26-12-2003, 02:23
Original geschrieben von peschmae
Aber damit geht natürlich auch sonst noch das Verhalten der Pipe verloren (es command2 fängt schon an bevor command1 beendet wurde)

Ich bin mir nicht sicher, ob ich Dich richtig verstanden habe, aber in einem Befehl


command1; command2

wird afaik das zweite Kommando erst ausgefuehrt, nachdem das erste seinen exit status bekannt gegeben hat. Ebenso, wenn man die Kommandos auf zwei Zeilen in einem Skript ausfuehrt. Das gilt zumindest, solange man das erste Kommando nicht im Hintergrund ausfuehrt!

Gruss,

Samsara

peschmae
26-12-2003, 12:36
... ja

aber mit Pipe ist das nicht so.

z.B. was ich oft brauche:
mkisofs -J -r ~ | cdrecord -dev=0,0,0 -speed=2 -eject -

da fängt cdrecord schon mal an, bevor mkisofs fertig ist. Und das Verhalten kriegst du nicht mehr hin, wenn du - weil du z.B. den exit-Status von mkisofs brauchst - das ganze so machst:
mkisofs -J -R ~ -o /tmp/tmp.iso && cdrecord -dev=0,0,0 -speed=2 -eject /tmp/tmp.iso

MfG Peschmä

samsara
27-12-2003, 16:55
Okay, verstanden :)

Samsara