Як я бачу список усіх визначених в даний час змінних середовища в баш-терміналі Linux?


Відповіді:


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 має рацію - це означає, що ця прийнята відповідь була дуже неправильною. Відредаговано так, що він містить лише експортовані змінні.
Volker Siegel

12
compgen -v

друкує змінні оболонки (але не значення).

compgen -e

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

Різниця між змінними оболонки та експортованими змінними: https://unix.stackexchange.com/questions/3507/difference-bet between-environment-variables-and-exported-environment-variables-in-b? rq=1


compgen -eце саме те, що я хотів!
хао
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.