[英]Unexpected environment variable unset
在 Bash 中,某些全局變量會在命令tee
運行后意外取消設置。
測試代碼如下:
#!/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
結果:
normal_test
set GLOBAL_VARIABLE(global_variable)
get GLOBAL_VARIABLE(global_variable)
unnormal_test
set GLOBAL_VARIABLE(global_variable)
get GLOBAL_VARIABLE()
unnormal_test
中GLOBAL_VARIABLE的值為null,為什么?
問題出在這一行:
set_global_variable |tee random_file
運行此行時,bash 將為管道的每個組件創建一個子 shell 並在那里運行它們。 所以set_global_variable
實際上會設置變量,但它會在一個單獨的過程中完成。 當您在下一行運行get_global_variable
時,您仍處於不受此影響的原始進程中。
這是該效果的一個更簡單的示例:
true | a=1
echo $a
由於與上述相同的原因,這將不會打印任何內容。 另一方面:
true | { a=1; echo $a; }
將打印 1,因為echo $a
是從與a=1
相同的子shell 運行的。 不過,最后一個例子在實踐中並不是很有用。
所以一般規則,不要在子shell中設置變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.