
В терминале Linux bash часто устанавливается много переменных окружения, таких как $PATH
и $HOME
.
Можно ли увидеть все установленные переменные окружения? Как?
решение1
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
не нет.
решение2
Команда env
без аргументов выведет список "экспортированных" переменных среды и их значений. Эти переменные становятся видимыми для подпроцессов - многие другие переменные среды не отображаются при этом и используются только внутри запущенной оболочки, например, для конфигурации.
решение3
compgen -v
выводит переменные оболочки (но не значения).
compgen -e
выводит экспортированные переменные, т.е. те, которые наследуются процессами, запускаемыми этой оболочкой (но не их значения).
Разница между оболочкой и экспортируемыми переменными:https://unix.stackexchange.com/questions/3507/разница-между-переменными-окружающей-среды-и-экспортированными-переменными-окружающей-среды-в-b?rq=1
решение4
Объединяя некоторые из предыдущих ответов, я нахожу следующее полезным:
compgen -v | sort | while read var; do [ -z "${!var}" ] || echo $var=${!var} ; done
compgen -v
: Вывести имена всех переменных, как локальных, так и экспортированных.sort
: Алфавитный порядок.${!var}
: Получить значение $var (косвенная адресация переменной).-z
условие: проверить, равно ли значение нулю, в противном случае вывести «переменная=значение».
Примечание:
printenv
тоже здорово, но оно покажет только список экспортированных переменных среды, а не локальных/bash-переменных.