Beim Exportieren wird die Variable nicht festgelegt, wenn sie an einen anderen Befehl weitergeleitet wird.

Beim Exportieren wird die Variable nicht festgelegt, wenn sie an einen anderen Befehl weitergeleitet wird.

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 catdort). 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 varnach 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

nwas 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, USERmüssen Sie $vorher. Und Pipe on exportist bedeutungslos, da exportder Befehl keine Ausgabe an STDOUT hat

verwandte Informationen