PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Variablen, Variablen, Variablen



thommy
17-01-2001, 11:33
Eigentlich kenne ich mich mit der Bash (2.04) schon recht ordentlich aus, dennoch führten meine Spielereien mal wieder zu einem Effekt, den ich mir nicht erklären kann:

<pre>
user@sonne&gt; { foobar=bla; }
user@sonne&gt; echo $foobar
bla
#
# Das Verhalten ist logisch
#
user@sonne&gt; { foobar=blabla; echo "test"; }
test
user@sonne&gt; echo $foobar
blabla
#
# auch klar
#
user@sonne&gt; { foobar=blablabla; echo "test"; } | less
# "test" steht in less, aber...:
user@sonne&gt; echo $foobar
blabla
</pre>

Wer hat mir das "bla" geklaut???


Thomas

thommy
17-01-2001, 13:06
Die in den geschweiften Klammern eingebetteten Kommandos erzeugen nur eine gemeinsame Ausgabe; die Variablenzuweisung sollte - nach meinem Verständnis - in der aktuellen Shell laufen! Ich kann mir aber keinen Reim darauf machen, warum die Variablenzuweisung ihre Wirksamkeit verliert, nur weil die Ausgabe in eine Pipe gespeist wird. Nach meiner Logik sollte alles links der Pipe und alles rechts der Pipe in einer eigenen Umgebung laufen, wobei - abgesehen von der Kommunikation über die Pipe - keine Wechselwirkungen bestehen sollten.

Übrigens klappt die Variablenzuweisung, wenn man anstatt der Pipe eine Umleitung in eine Datei vornimmt. Das deutet dann doch wieder auf die Umgebung hin. Fragen über Fragen...

Ach ja, im obigen Beispiel macht die Gruppierung natürlich keinen Sinn. Konkret geht es um einen Aufruf von "dialog --gauge", der seine Eingaben von stdin erfordert. Diese Eingaben sollen in einer Schleife erzeugt werden, wobei gleichzeitig Informationen in einer Variable festgehalten werden sollen. Der Ausschnitt sieht so aus:

<pre>
{
for i in $Dateiliste; do
Bearbeitet=$Bearbeitet+1
# Die folgende Ausgabe steuert die Anzeige von dialog --gauge
echo $(($Bearbeitet * 100 / $Anzahl))
#
# Nachfolgend sollen alle Dateinamen, die das Muster enthalten in einer Variablen gespeichert werden:
grep $ignorecase -q $Muster $i && Ergebnisliste="$Ergebnisliste $i"
done
} | dialog --gauge "Durchsuche Dateien..." 6 40 0
</pre>

Genau hier besteht das Problem, dass durch die Pipe die Variable Ergebnisliste scheinbar in einem eigenen Kontext läuft. Ich weiß aber nicht warum und auch nicht, wie es es fixen könnte (was geht, ist den Dateinamen in eine Datei zu schreiben, aber das möchte ich eigentlich vermeiden).

Thomas

[Dieser Beitrag wurde von thommy am 17. Januar 2001 editiert.]

18-01-2001, 00:12
ich versteh zwar nicht so viel davon wie du, aber es scheint mir auf den ersten blick nicht unlogisch, daß foobar nur im environment von less auf blablabla steht.
mit

foobar=blablabla; { echo "test"; }|less

wäre das anders, oder?



------------------
mfg,
marsellus