Hallo On Monday 05 August 2002 00:30, Jan Trippler wrote:
On Mon, 05 Aug 2002 at 00:06 (+0200), Axel Heinrici wrote:
Am Sonntag, 4. August 2002 23:39 schrieb Matthias Hentges:
.............
In dem Skript steht: "cat .tmp | grep "java" | while read line"
Ich verstehe das so, dass grep und die while-Schleife jeweils in einer Subshell laufen. ***verwirrt sei****
Bin ich bei dem Thema auch ;-) Ich kann mich nebulös erinnern, dass ich mal bei einem ziemlich dicken Script mit genau diesem Problem auf die Schnauze gefallen bin - eine Variable aus einer while-Schleife kommt einfach nicht außerhalb der Schleife an. Dass die Schleife nicht in einer Subshell läuft, kann man relativ einfach prüfen: Definiere vor der Schleife eine Variable, ohne sie zu exportieren, dann darf sie nur in der aktuellen Shell bekannt sein. Frage sie innerhalb der while-Schleife ab. Noch verrückter: Verändere sie innerhalb der Schleife nach der Abfrage und schau sie Dir dann an.
v=42 while test $v -eq 42; do echo $v v=`expr $v + 624` echo $v done echo $v
Das ergibt: 42 666 666
Hier lief die while-Schleife in der Shell in der das Skript selbst läuft.
OK, so erwartet man das.
Nächster Versuch:
v=42 echo $v | while read x; do echo $v $x v=`expr $x + 624` echo $v done echo $v
Jetzt sehen wir: 42 42 666 42
Und da komme ich nicht mehr mit!
Und hier läuft while in einer Subshell, weil es ein einer pipe ist. Deswegen kommt der Wert der in v ist da nicht raus. Ich finde es verwirrender das die Variablen in der Subshell offenbar erstmal die Werte haben, die in der Hauptshell definiert wurden und nicht leer sind. Jetzt fügt sich bei mir alles wieder zusammen. mfg Axel