30

В терминале Linux bash часто устанавливается множество переменных среды, таких как $PATH и $HOME .

Можно ли увидеть все переменные среды, которые были установлены? Как?

3 ответа3

29

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 - нет.

23

Команда env без аргументов выведет список "экспортированных" переменных среды и их значений. Эти переменные становятся видимыми для подпроцессов - многие другие переменные окружения не отображаются с этим, а используются только внутри работающей оболочки, например, для конфигурации.

10
compgen -v

печатает переменные оболочки (но не значения).

compgen -e

печатает экспортированные переменные, т.е. те, которые наследуются процессами, которые запускает эта оболочка (но не их значения).

Разница между оболочкой и экспортированными переменными: https://unix.stackexchange.com/questions/3507/difference-between-environment-variables-and-exported-environment-variables-in-b?rq=1

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .