Beim Weiterleiten von „Export“ an einen anderen Befehl (mit Bash 3.2) wird die Variable nicht geändert.
export USER=new | cat ; env | grep USER
Ausgabe:USER=old
Die Benutzervariable wird nicht geändert und bleibt gleich. Der Export wurde jedoch erfolgreich beendet: export USER=new | echo $?
Es wird 0 ausgegeben.
Antwort1
Normalerweise werden die Teile einer Pipeline (außer dem letzten in einigen Shells) in Untershells ausgeführt, d. h. die Shell erstellt für jeden von ihnen eine Kopie von sich selbst, und dann verarbeitet jede Kopie den Befehl in diesem Teil und führt alle externen Befehle aus (wie cat
dort). Die Hauptshell, die mit dem nächsten Befehl fortfährt (die andere Pipeline), sieht den geänderten Wert nicht.
(Und was würden Sie überhaupt als Wert var
nach einem Befehl wie erwarten var=foo | var=bar
?)
Normalerweise kommt das vor, wenn Sie Variablenzuweisungen im letzten Teil einer Pipeline haben, wie
n=0
some command | while read line; do n=$((n+1)); done
n
was in vielen Shells set to belassen würde 0
, aber nicht in allen: ksh und zsh führen den letzten Teil in der Hauptshell aus, und Bash hat eine Option dafür. Dies wird inWarum ist meine Variable in einer „while read“-Schleife lokal, aber nicht in einer anderen, scheinbar ähnlichen Schleife?.
Antwort2
Schreiben Sie den Code folgendermaßen um:
export USER=new
env | grep $USER
Um den Inhalt der Variablen zu erhalten, USER
müssen Sie $
vorher. Und Pipe on export
ist bedeutungslos, da export
der Befehl keine Ausgabe an STDOUT hat