簡體   English   中英

意外的環境變量未設置

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM