У терміналі 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це саме те, що я хотів!