Mit bash 4.1.2 und 4.3.48 gibt das folgende Skript die erwartete Ausgabe:
%Vor%Ausgabe wie erwartet:
%Vor% Wenn jedoch stdout von der Funktion an einen anderen Prozess weitergeleitet wird, funktioniert die Zuweisung der __resultvar
-Variable nicht mehr:
Unerwartete Ausgabe:
%Vor% Warum funktioniert printf -v
im zweiten Fall nicht? Sollte printf -v
den Wert nicht in die Ergebnisvariable unabhängig schreiben, ob die Ausgabe der Funktion an einen anderen Prozess weitergeleitet wird?
Siehe man bash
, Abschnitt zu Pipelines
:
Jeder Befehl in einer Pipeline wird als separater Prozess (d. h. in einer Untershell) ausgeführt.
Deshalb erhält cmd | cat
beim Schreiben von cmd
eine Kopie der Variablen, die nicht geändert werden kann.
Eine einfache Demo:
%Vor% Interessanterweise passiert dasselbe auch, wenn eval $__resultvar="'ERROR'"
anstelle von printf -v
verwendet wird. Dies ist also kein printf
verwandtes Problem.
Stattdessen fügt das Hinzufügen von echo $BASH_SUBSHELL
zum Hauptskript und zur Funktion hinzu, dass die Shell im zweiten Fall eine Untershell hervorbringt, da sie die Ausgabe der Funktion an einen anderen Prozess übergeben muss. Daher wird die Funktion in einer Untershell ausgeführt:
Ausgabe:
%Vor%Dies ist der Grund, warum Variablenzuweisungen innerhalb der Funktion nicht an das aufrufende Skript zurückgegeben werden.