2016-09-19 4 views
1

In Bash wird einige globale Variable unerwartet deaktiviert, nachdem der Befehl tee ausgeführt wird.Unerwartete Umgebungsvariable nicht festgelegt

Prüfregeln wie folgt:

#!/bin/bash 
function set_global_variable(){ 
     GLOBAL_VARIABLE="global_variable" 
     echo "set GLOBAL_VARIABLE($GLOBAL_VARIABLE)" 
} 

function get_global_variable(){ 
     echo "get GLOBAL_VARIABLE($GLOBAL_VARIABLE)" 
} 

function normal_test(){ 
     unset GLOBAL_VARIABLE 
     set_global_variable 
     get_global_variable 
} 

function unnormal_test(){ 
     unset GLOBAL_VARIABLE 
     set_global_variable |tee random_file 
     get_global_variable 
} 

echo "normal_test" 
normal_test 

echo "unnormal_test" 
unnormal_test 

Das Ergebnis:

normal_test 
set GLOBAL_VARIABLE(global_variable) 
get GLOBAL_VARIABLE(global_variable) 
unnormal_test 
set GLOBAL_VARIABLE(global_variable) 
get GLOBAL_VARIABLE() 

Der Wert von global_variable in unnormal_test null ist, warum?

+0

In einer Pipe werden Befehle in Unter-Shells ausgeführt, was bedeutet, dass alle Änderungen, die sie an der Umgebung vornehmen, in der Parent-Shell nicht sichtbar sind. – Leon

Antwort

1

Das Problem ist, mit dieser Zeile:

set_global_variable |tee random_file 

Wenn diese Linie läuft ist, bash ein Sub-Shell für jede Komponente der Pipeline zu schaffen und sie dort ausführen. So set_global_variable wird tatsächlich die Variable festlegen, aber es wird das in einem separaten Prozess tun. Wenn Sie get_global_variable in der nächsten Zeile ausgeführt werden, befinden Sie sich noch in dem ursprünglichen Prozess, der nicht davon betroffen war.

Hier ist ein einfacheres Beispiel dieser Wirkung:

true | a=1 
echo $a 

Das hat nichts aus den gleichen Gründen gedruckt wird oben erläutert. Auf der anderen Seite:

true | { a=1; echo $a; } 

werden 1 drucken, weil echo $a aus dem gleichen Subshell wie a=1 laufen ist. Das letzte Beispiel ist jedoch in der Praxis nicht sehr nützlich.

Also eine allgemeine Regel, setzen Sie Variablen nicht in einer Subshell.

Verwandte Themen