在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的值为空,为什么?
答案 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中设置变量。