意外的环境变量未设置

时间:2016-09-19 07:28:34

标签: bash shell environment-variables tee

在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的值为空,为什么?

1 个答案:

答案 0 :(得分:1)

问题在于这一行:

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中设置变量。