Hallo Wolfgang, hallo Jürgen, hallo Leute, Am Mittwoch, 28. Juli 2004 10:06 schrieb Wolfgang Hinsch:
Am Mittwoch, 28. Juli 2004 09:43 schrieb Dr. Jürgen Vollmer:
Das Script verkürzt: FARBE=rot while true ; do ... FARBE=gruen ... done | cmd $FARBE ^^^ Wie schon von vielen geschrieben: die Variable "überlebt" die Pipe nicht, weil eine Pipe gleichzeitig zu einer Subshell führt.
Ich habe mal eine schöne Lösung gebastelt, um dieses Problem zu umgehen, allerdings nur mit Ausgabe der Variable nach Pipe-Ende und nicht in den nächsten Prozess hinter der Pipe. http://www.cboltz.de/de/linux/bash/?sl Wenn Du das eval rechtzeitig beendest, sollte es auch mit der Pipe klappen. Also: ("...." bitte durch Code wie auf meiner Homepage erklärt ersetzen) eval `while true ; do echo "FARBE=rot" >&4 ; done 4>&1 >&3` | cmd $FARBE Möglicherweise musst Du den Block vor der Pipe wieder auf stdout umleiten, also { eval `while true ; do echo "FARBE=rot" >&4 ; done 4>&1 >&3` ; } 3>&1 | cmd $FARBE Die Scripte auf meiner Homepage sind getestet und funktionieren, die Ergänzungen in dieser Mail sind nur ein Braindump, also ungetestet. Feedback erwünscht, dann ergänze ich das auch noch auf meiner Homepage ;-) Alternative: den Code etwas umstrukturieren, nämlich den Output in eine Variable packen und diese anschließend per echo an den nächsten Befehl weiterreichen. Also erstmal alles wie auf Homepage beschrieben (erste Methode) und danach echo "$text_to_print" | befehl
Einspruch!
-> cat ttt FARBE=rot while [ $FARBE = "rot" ] ; do FARBE=gruen done echo $FARBE
-> ./ttt gruen
Ist meine bash kaputt?
Nö, Dein Testscript ist zu kurz. Da kommt nirgends eine Pipe und damit auch keine Subshell vor. Gruß Christian Boltz -- Was zum Henker is nu AMSN schon wieder? Is das IRC in der "take n-plus-1 die 42sten" Reinkarnation? Mannmannmann, diese Chat-Dinger vermehren sich ja wie die Karnickel, muss ich mir auch mal einen schreiben, um noch hip zu sein, oder was? [David Haller in suse-linux]