"printf -v" innerhalb der Funktion funktioniert nicht mit umgeleiteter Ausgabe

8

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:

%Vor%

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?

    
Andreas Fester 12.10.2017, 13:14
quelle

2 Antworten

8

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%     
randomir 12.10.2017, 13:31
quelle
2

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:

%Vor%

Ausgabe:

%Vor%

Dies ist der Grund, warum Variablenzuweisungen innerhalb der Funktion nicht an das aufrufende Skript zurückgegeben werden.

    
Andreas Fester 12.10.2017 13:33
quelle

Tags und Links