Разница между переменной окружения и переменной оболочки

8

Говорят, что переменные среды наследуются в дочерних процессах, а переменные оболочки - нет. Однако следующий тест показывает, что переменные оболочки рассматриваются в дочернем процессе как переменные среды. В чем разница?

> bash --version
GNU bash, version 3.2.39(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
> export TEST="ENV_TEST"    #env var
> sh -c "echo \$TEST"
ENV_TEST
> TEST="SHELL_TEST"         #shell var
> sh -c "echo \$TEST"       #shell var is seen in child process
SHELL_TEST
нин
источник

Ответы:

9

Ваше второе назначение TEST="SHELL_TEST"не отменяет экспорт переменной. Он по-прежнему помечен как «быть унаследованным детьми». И значение, унаследованное дочерним элементом, является значением, установленным в данный момент в родительском элементе.
Другими словами, ваше второе назначение не возвращает статус TESTпеременной оболочки, это все еще переменная среды в соответствии с этой терминологией.

Вы должны были бы отменить его экспорт, чтобы он стал незаданным в дочерних процессах:

$ typeset +x TEST
$ sh -c 'echo $TEST'

$
Мат
источник
Привет, Мат, спасибо за ответ. Таким образом, мое понимание (есть две переменные с именем TEST, одна для переменной среды и одна для переменной оболочки, shell var TEST shadows env var TEST.) Неверна, в Bash есть только одна переменная, она всегда является переменной оболочки и может быть устанавливается для экспорта и действует как переменная окружения. Это зависит от Bash и зависит от реализации, или оно универсально во всех оболочках. Спасибо.
Нин
Не уверен насчет «универсального», но он работает так же с bash, ksh и zsh по крайней мере.
Мат
2
@ning Вот как работают все современные оболочки в стиле POSIX / Bourne (ash, ksh, bash, zsh). Существовали древние версии оболочки Bourne, в которых изменение экспортированной переменной оболочки не изменяло значение в среде, но вы вряд ли встретите их больше. Csh работает по-другому, вы все еще можете столкнуться с этим в старомодных средах, но он тоже давно устарел.
Жиль "ТАК - перестань быть злым"
@ Жиль Спасибо, что разъяснили, что происходит и почему. Как кто-то сказал, каждый разработчик Unix также должен быть историком.
нин