Неожиданная переменная среды не установлена

В 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, Последний пример не очень полезен на практике.

Таким образом, общее правило, не устанавливайте переменные в подоболочке.

Другие вопросы по тегам