В терминале Linux bash часто устанавливается множество переменных среды, например, $PATH
и $HOME
.
Можно ли увидеть все переменные среды, которые были установлены? Как?
В терминале Linux bash часто устанавливается множество переменных среды, например, $PATH
и $HOME
.
Можно ли увидеть все переменные среды, которые были установлены? Как?
Ответы:
TL; DR: использовать(set -o posix ; set)
В соответствии с руководством по Bash вы можете использовать set
встроенную команду, чтобы показать все переменные среды , которые были установлены. Команда set
также отобразит определения любых функций. Если вы хотите видеть только переменные, а не функции, то вы можете включить режим POSIX перед запуском команды set. Самый простой способ сделать это - с помощью set -o posix
, но он оставит режим POSIX включенным, пока вы не выключите его set +o posix
.
Следовательно, следующая команда покажет все определенные переменные среды с использованием подоболочки, не влияя на соответствие POSIX в вашей текущей оболочке.
(set -o posix ; set)
@RedGrittyBrick и @iglvzx предложили использовать env
команду, однако эта команда не предоставит полный список переменных среды. env
покажет только те переменные, которые были помечены для экспорта. Сравните вывод env | sort
и , export -p
и вы увидите , что я имею в виду. Вы можете запустить, comm -23 <(set -o posix; set) <(env|sort)
если хотите увидеть, какие переменные среды не экспортируются.
Причина расхождения заключается в том, что env
это отдельный исполняемый файл, а не set
встроенная команда оболочки. Согласно руководству по Bash, когда выполняется команда, которая не является встроенной командой или функцией оболочки, она будет получать только те переменные среды, которые были помечены для экспорта в Bash . Есть много переменных, которые не экспортируются. Поэтому, если вы хотите увидеть все переменные, которые определены в вашей оболочке, вы должны использовать set
команду, как указано в руководстве.
Вы можете легко проверить это поведение для себя, используя следующие команды.
MY_TEST_VARIABLE="This is my test variable."
set | grep MY_TEST_VARIABLE
env | grep MY_TEST_VARIABLE
Вы увидите, что set
обеспечивает вывод, а env
нет.
Команда env
без аргументов выведет список «экспортированных» переменных среды и их значений. Эти переменные становятся видимыми для подпроцессов - многие другие переменные окружения не отображаются с этим и используются только внутри работающей оболочки, например, для конфигурации.
printenv
, так как оба env
и set
имеют другие функции, чем просто вывод среды.
env
будет печатать только список переменных среды, которые были помечены для экспорта. Он не будет печатать все переменные.
compgen -v
печатает переменные оболочки (но не значения).
compgen -e
печатает экспортированные переменные, т.е. те, которые наследуются процессами, которые запускает эта оболочка (но не их значения).
Разница между оболочкой и экспортируемыми переменными: https://unix.stackexchange.com/questions/3507/difference-between-environment-variables-and-exported-environment-variables-in-b?rq=1
compgen -e
это именно то, что я хотел!