Как посмотреть список всех определенных на данный момент переменных среды в терминале Linux bash?


31

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

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


Ответы:


32

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


24

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


10
Я предпочитаю printenv, так как оба envи setимеют другие функции, чем просто вывод среды.
iglvzx

3
envбудет печатать только список переменных среды, которые были помечены для экспорта. Он не будет печатать все переменные.
Морская звезда

4
@Starfish прав - это означает, что этот принятый ответ был очень неправильным. Отредактированный, чтобы сказать, что это перечисляет только экспортируемые переменные.
Фолькер Сигел

12
compgen -v

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

compgen -e

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

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


compgen -eэто именно то, что я хотел!
Хао
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.