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

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

В терминале 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-переменных.

Связанный контент