У терміналі bash Linux часто встановлено багато змінних середовища, як, наприклад, $PATH
та $HOME
.
Чи можна побачити всі встановлені змінні середовища? Як?
У терміналі bash Linux часто встановлено багато змінних середовища, як, наприклад, $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-bet between-environment-variables-and-exported-environment-variables-in-b? rq=1
compgen -e
це саме те, що я хотів!