Wenn man in der Bash die Eingabe für Werte an einen while-read loop über eine pipe macht, läuft der loop in einer Subshell. Das hat den Effekt, dass man "von aussen" nicht auf Variablen die im while-loop gesetzt werden zugreifen kann.
Die Bash bietet keine Möglichkeit in einer Subshell Variablen im Scope der Orginal-Shell zu manipulieren oder zu setzen. Zumindest hab ich nichts dazu gefunden.
Beispiel:
CODE:
#!/bin/bash
ret='nicht gesetzt'
for var in t1 t2 t3
do
echo $var |
while read var2
do
ret=$var2
echo "sub-shell: $ret"
done
echo "main-scope: $ret"
done
Eine Lösung für das Problem kann es sein, den kompletten Loop zu einem command zusammen zu fassen. Damit kann ein Ergebnis im Loop das mit echo ausgegeben wird, einer Variablen ausserhalb zugewiesen werden.
Beispiel:
CODE:
#!/bin/bash
ret='nicht gesetzt'
for var in t1 t2 t3
do
ret=$(echo $var |
{
while read var2
do
ret2=$var2
done
echo $ret2
}
)
echo "main-scope: $ret"
done
Ob man sowas so haben will sei mal dahin gestellt.
Damit ich aber selber nachlesen kann wie es gehen könnte wenn ich so was mal wieder brauche, steht das jetzt hier. Vielleicht hilft's ja noch jemandem der glaubt sowas machen zu wollen ;-)