Неожиданная переменная среды не установлена
В 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()
Значение GLOBAL_VARIABLE в unnormal_test
ноль, почему?
1 ответ
Проблема в этой строке:
set_global_variable |tee random_file
Когда эта строка запускается, bash создаст подоболочку для каждого компонента конвейера и запустит их там. Так set_global_variable
фактически установит переменную, но сделает это в отдельном процессе. Когда ты бежишь get_global_variable
в следующей строке вы все еще находитесь в исходном процессе, который не был затронут этим.
Вот более простой пример этого эффекта:
true | a=1
echo $a
Это ничего не будет печатать по тем же причинам, которые были описаны выше. С другой стороны:
true | { a=1; echo $a; }
напечатает 1, потому что echo $a
запускается из той же оболочки, что и a=1
, Последний пример не очень полезен на практике.
Таким образом, общее правило, не устанавливайте переменные в подоболочке.