Hi Bash-Freaks, fummel schon ne ganze Weile an nem Problem rum: grep "abc" source|tail -10|myprog wie komm ich da an die Errorcodes von grep und tail? Alfred
Hallo Leute, Am Montag 15 September 2003 09:32 schrieb Alfred Reinhard:
fummel schon ne ganze Weile an nem Problem rum:
grep "abc" source|tail -10|myprog
wie komm ich da an die Errorcodes von grep und tail?
Gute Frage - einfach ist das nicht. Ich kann Dir erstmal einen Workaround anbieten, der den Exitcode auf STDERR verfrachtet: --------------------------------------------------------------------- { { grep -i Mist /var/log/messages echo "grepexit=$?" >&2; } | { tail -n 10 echo "tailexit=$?" >&2 } | cat # statt myprog } >&3 --------------------------------------------------------------------- Ausgabe auf der Konsole: grep-exitcode 1 tail-exitcode 0 In meiner /var/log/messages steht also kein Mist ;-) Ganz optimal ist diese Lösung noch nicht (lässt sich nicht script- technisch weiterverarbeiten), weiter unten findet sich noch eine bessere Lösung, die mir nach einiger Zeit und längerer Bastelei eingefallen ist. Zwischendurch noch eine Frage an die "echten" Spezialisten: Ich hätte erwartet, dass ich zumindest den Exitcode von grep, das ja nicht in einer Subshell läuft ("nur" gruppiert), einer Variable zuweisen kann, die hinterher verfügbar ist. Meine Versuche diesbezüglich [1] sind aber fehlgeschlagen. (Dass die Befehle hinter einer Pipe in einer Subshell laufen und deshalb keine Variablen "übrigbleiben" können, ist mir klar.) So, jetzt aber noch zu der besseren Lösung: --------------------------------------------------------------------- exec 3>&1 # 3. Ausgabekanal öffnen eval ` { { grep Mist /var/log/messages echo "grepexit=$?" >&2; } | { tail -n 10 echo "tailexit=$?" >&2 } | cat # statt myprog } 2>&1 >&3 ` echo "nach Scriptende:" echo "grepexit $grepexit" echo "tailexit $tailexit" --------------------------------------------------------------------- Ausgabe auf der Konsole: nach Scriptende: grepexit 1 tailexit 0 Die Exitcodes stehen also als Variablen zur Verfügung. Ach so: Falls Du nicht verstehtst, was ich da getrickst habe - einfach nachfragen (ich versteh es übrigens selber noch nicht so recht, aber es funktioniert ;-) Gruß Christian Boltz PS: Idealerweise solltest Du die Exitcodes auf einen eigenen Ausgabekanal umleiten (>&4), da sich in meinem Konstrukt auch Fehlermeldungen im "eval" verfangen, was äußerst unschön ist. Das überlassse ich Dir allerdings als Übungsaufgabe - ich bin jetzt zu müde dazu ;-) (Tip: das 2>&1 musst Du wohl in 4>&1 ändern) [1] Mit diesem Script habe ich getestet: ( grep nixda /var/log/messages grepexit="$?" echo grep-exitcode $grepexit >&2; export grepexit # auch ohne diese Zeile getestet, gleiches Ergebnis ) | ( tail -n 10 export tailexit="$?" echo tail-exitcode $tailexit >&2 echo Zwischenkontrolle grepexit $grepexit >&2 ) | cat echo Kontrolle: grepexit $grepexit echo Kontrolle: tailexit $tailexit Ausgabe: grep-exitcode 1 tail-exitcode 0 Zwischenkontrolle grepexit <-- wieso leer? Kontrolle: grepexit <-- wieso leer? Kontrolle: tailexit <-- klar, da Subshell --
Entwickelt mein Rechner ein Eigenleben? Klar, das machen doch alle Rechner. Kann er das nicht in _seiner_ Freizeit ausleben? [> Helga Fischer und Hans-Alexander Leukert in suse-linux]
Hallo, Am Tue, 16 Sep 2003, Christian Boltz schrieb: [..]
Zwischendurch noch eine Frage an die "echten" Spezialisten: Ich hätte erwartet, dass ich zumindest den Exitcode von grep, das ja nicht in einer Subshell läuft ("nur" gruppiert), einer Variable zuweisen kann,
Bei einer Pipe werden alle Prozesse vor und nach der Pipe jew. in einer eigenen subshell ausgefuehrt... Steht irgendwo in man bash ;)
PS: Idealerweise solltest Du die Exitcodes auf einen eigenen Ausgabekanal umleiten (>&4), da sich in meinem Konstrukt auch Fehlermeldungen im "eval" verfangen, was äußerst unschön ist. Das überlassse ich Dir allerdings als Übungsaufgabe - ich bin jetzt zu müde dazu ;-) (Tip: das 2>&1 musst Du wohl in 4>&1 ändern)
Jup. -dnh -- Doesn't it bother you, that we have to search for intelligent life --- OUT THERE??
participants (3)
-
Alfred Reinhard
-
Christian Boltz
-
David Haller