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