В терминале 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это именно то, что я хотел!