Shellskript: Variable aus einer Subshell exportieren
Hallo Liste wie ich gerade erfahren musste, werden Kommandos in Pipe-Konstruktionen in einer Sub-Shell ausgeführt, wenn mindestens ein Teil (ausgenommen des letzten Kommandos) des Konstruktes ein Shell-Builtin-Command ist. Quelle: http://www3.informatik.uni-erlangen.de/Lehre/DOLINUX/WS2001/proto_011031-1.h... Jetzt habe ich folgendes Skript: ----------- a=0 b=0 while [ $a -le 3 ] do while [ $b -le 3 ] do if [ $b -eq 2 ] then bla=blub echo $bla # hier ist $bla gesetzt fi b=$(($b+1)) done echo $bla #hier ist $bla auch noch gesetzt a=$(($a+1)) done|sort echo $bla # hier ist $bla wieder leer ------------- Dass diese Schleife total sinnlos ist, ist mir klar, es geht um den prinzipiellen Aufbau. Nach diesen Schleifen möchte ich $bla ausgeben. $bla ist aber leer. "bla=blub" durch "export bla=blub" zu ersetzen, bringt keinen Erfolg. Gibt es eine Möglichkeit, die Variable aus dieser Subshell herauszukriegen? Grüße Dominik
Dominik Klein wrote:
Hallo Liste
wie ich gerade erfahren musste, werden Kommandos in Pipe-Konstruktionen in einer Sub-Shell ausgeführt, wenn mindestens ein Teil (ausgenommen des letzten Kommandos) des Konstruktes ein Shell-Builtin-Command ist.
Quelle: http://www3.informatik.uni-erlangen.de/Lehre/DOLINUX/WS2001/proto_011031-1.h...
Jetzt habe ich folgendes Skript: ----------- a=0 b=0 while [ $a -le 3 ] do while [ $b -le 3 ] do if [ $b -eq 2 ] then bla=blub echo $bla # hier ist $bla gesetzt fi b=$(($b+1)) done
echo $bla #hier ist $bla auch noch gesetzt a=$(($a+1))
done|sort
echo $bla # hier ist $bla wieder leer -------------
Dass diese Schleife total sinnlos ist, ist mir klar, es geht um den prinzipiellen Aufbau. Nach diesen Schleifen möchte ich $bla ausgeben. $bla ist aber leer.
"bla=blub" durch "export bla=blub" zu ersetzen, bringt keinen Erfolg.
Gibt es eine Möglichkeit, die Variable aus dieser Subshell herauszukriegen?
Ja, indem du die while-Schleife in eine Funktion packst und den gewünschten Wert über die Funktion zurückgibst. Darüber habe ich mich auch schon geärgert. Oder in Datei zwischenparken: versuch="geht" echo "nicht" | while read wort; do versuch="${versuch} ${wort}" echo -e "In schleife: $versuch \n" set versuch=$versuch echo $versuch > exp_versuch done echo -e "Nach Schleife: $versuch \n" versuch_neu=`cat exp_versuch` echo -e "Aus Datei: $versuch_neu \n" Sandy -- Antworten bitte nur in die Mailingliste! PMs bitte an: news-reply2 (@) japantest (.) homelinux (.) com
Dominik Klein wrote:
echo $versuch > exp_versuch
Okay, dass ich auf den Umweg auch bereits gekommen war, hätte ich wohl schreiben sollen. Das ist halt ziemlich ineffizient, wenn die Schleife ein paar hundert mal läuft.
Anders gehts nicht?
Nicht dass ich wüsste. Problem ist halt eben, dass die while-Schleife eine Subshell aufmacht, aus der die Variablen nicht exportiert werden. Du könntest eine Bedingung setzen, damit nur dann tatsächlich in die Datei geschrieben wird, wenn die Abbruchbedingung erfüllt ist. Wenn das keine Lösung ist, dann mache das besser in Perl oder einer anderen Script/Programmiersprache. Sandy -- Antworten bitte nur in die Mailingliste! PMs bitte an: news-reply2 (@) japantest (.) homelinux (.) com
Am Mittwoch, 18. Oktober 2006 12:09 schrieb Dominik Klein:
Dass diese Schleife total sinnlos ist, ist mir klar, es geht um den prinzipiellen Aufbau. Nach diesen Schleifen möchte ich $bla ausgeben. $bla ist aber leer.
Hallo! Probier mal das Script mit . ./script aufzurufen. Dann müsste es klappen. Ciao Burkhard
Dominik Klein wrote (please find the answer below the original text):
Hallo Liste
wie ich gerade erfahren musste, werden Kommandos in Pipe-Konstruktionen in einer Sub-Shell ausgeführt, wenn mindestens ein Teil (ausgenommen des letzten Kommandos) des Konstruktes ein Shell-Builtin-Command ist.
Quelle: http://www3.informatik.uni-erlangen.de/Lehre/DOLINUX/WS2001/proto_011031-1.h...
Jetzt habe ich folgendes Skript: ----------- a=0 b=0 while [ $a -le 3 ] do while [ $b -le 3 ] do if [ $b -eq 2 ] then bla=blub echo $bla # hier ist $bla gesetzt fi b=$(($b+1)) done
echo $bla #hier ist $bla auch noch gesetzt a=$(($a+1))
done|sort
echo $bla # hier ist $bla wieder leer -------------
Dass diese Schleife total sinnlos ist, ist mir klar, es geht um den prinzipiellen Aufbau. Nach diesen Schleifen möchte ich $bla ausgeben. $bla ist aber leer.
"bla=blub" durch "export bla=blub" zu ersetzen, bringt keinen Erfolg.
Gibt es eine Möglichkeit, die Variable aus dieser Subshell herauszukriegen?
Grüße Dominik
Das scheint eher ein Übergabeproblem zu "sort" zu sein. Lass das "sort" weg, dann hast du auch dein "blub" wieder. Ansonsten könnte es evtl. helfen, die Zuweisungen in eine weitere Variable zu schreiben und die dann zu sortieren... -Ingo.
Das scheint eher ein Übergabeproblem zu "sort" zu sein.
Nein. While ist das Shell-Built-in-Command. Alles weitere: siehe oben.
Lass das "sort" weg, dann hast du auch dein "blub" wieder.
Darum geht's nicht. Ohne sort habe ich ja keine Pipe und somit keine Subshell mehr.
Ansonsten könnte es evtl. helfen, die Zuweisungen in eine weitere Variable zu schreiben und die dann zu sortieren...
Auch das ist nur ein weiteres Workaround (wie schon die Datei).
Dominik Klein wrote (please find the answer below the original text):
Das scheint eher ein Übergabeproblem zu "sort" zu sein.
Nein. While ist das Shell-Built-in-Command. Alles weitere: siehe oben.
Lass das "sort" weg, dann hast du auch dein "blub" wieder.
Darum geht's nicht. Ohne sort habe ich ja keine Pipe und somit keine Subshell mehr.
Ansonsten könnte es evtl. helfen, die Zuweisungen in eine weitere Variable zu schreiben und die dann zu sortieren...
Auch das ist nur ein weiteres Workaround (wie schon die Datei).
Sorry, Problem jetzt erst verstanden. Aber wenn ich "man bash" richtig interpretiere, gibt es auch keine Lösung für dich: Builtin commands that are invoked as part of a pipeline are also executed in a subshell environment. Changes made to the subshell environment cannot affect the shell's execution environment. -Ingo.
Sorry, Problem jetzt erst verstanden. Aber wenn ich "man bash" richtig interpretiere, gibt es auch keine Lösung für dich: Builtin commands that are invoked as part of a pipeline are also executed in a subshell environment. Changes made to the subshell environment cannot affect the shell's execution environment.
Das hatte ich wiederum bisher nicht gelesen. Danke.
Hallo, Am Mit, 18 Okt 2006, Dominik Klein schrieb:
wie ich gerade erfahren musste, werden Kommandos in Pipe-Konstruktionen in einer Sub-Shell ausgeführt, wenn mindestens ein Teil (ausgenommen des letzten Kommandos) des Konstruktes ein Shell-Builtin-Command ist.
Auch ohne builtin wird eine subshell aufgemacht. Loesung: http://www.cboltz.de/de/linux/bash/ -dnh -- 78: Kinderpornographie im Internet Schwarzer Peter für den nächsten Wahlkampf (Florian Kuehnert)
participants (5)
-
Burkhard Schichtel
-
David Haller
-
Dominik Klein
-
Ingo Freund
-
Sandy Drobic