Как я могу перечислить все переменные оболочки?

18

Читая об этом вопросе: В Zsh, как я могу перечислить все переменные среды? , Я задавался вопросом, как я могу перечислить все переменные оболочки ?

Кроме того, относится ли различие между переменными оболочки и переменными среды к оболочкам, отличным от zsh?

Меня в первую очередь интересуют Bash и Zsh, но было бы здорово узнать, как это сделать в других основных оболочках.

мистифицировать
источник

Ответы:

21

Перечислите все переменные оболочки

bash: использовать set -o posix ; set. Опции POSIX предназначены для того, чтобы не выводить слишком много информации, например, определения функций. declare -pтоже работает.

zsh : использовать typeset

Переменные оболочки и переменные среды

Переменная среды доступна для exec()дочерних процессов -ed (как копия. Если родительский процесс изменяет переменную, дочерняя среда не обновляется). Переменная, не относящаяся к среде, доступна только для текущей запущенной оболочки и fork()-ed-подоболочек. Это различие присутствует во всех оболочках.

(завершено благодаря комментариям)

Уриэль
источник
declare -pсделать то же самое
Костас
На этот вопрос также есть ответ здесь: stackoverflow.com/questions/1305237/…
Уриэль
1
set -o posixне существует в Zsh; setне выводит определения функций.
vinc17
1
set -o posixэто синтаксическая ошибка в большинстве оболочек.
mikeserv
3
Переменные оболочки также доступны в дочерних процессах. Разница возникает, когда дочерний процесс выполняет новую программу: переменные среды передаются exec, а переменные оболочки - нет.
Бармар
7

Есть много альтернатив:

printenv

Вывести значения указанной среды VARIABLE (s). Если переменная VARIABLE не указана, выведите пары «имя-значение» для них всех.

окр

env - запустить программу в измененной среде

экспорт

Установите переменную среды. Отметьте каждое имя для передачи дочерним процессам в среде .....

-p Показать вывод в форме, которая может быть повторно использована в качестве ввода.

Если имена не указаны или задана опция `-p ', отображается список экспортированных имен.

устанавливать

также полезно для получения переменных оболочки.

Если вам нужна дополнительная информация (целое число, экспорт), вы должны вместо этого использовать

набрана

Преимущество экспорта заключается в том, что его вывод может быть немедленно считан обратно в оболочку.

Наконец, есть

compgen -v

Показать возможные дополнения в зависимости от параметров.

который показывает все переменные, оболочку и окружение, без их значения или дополнительной информации. Вам нужно будет повторить $ VARIABLE_NAME, чтобы найти значение переменной. Но, по крайней мере, список полон. Это относится к Bash , а не Zsh .

MariusMatutiae
источник
1
exportне имеет никаких преимуществ перед set, по крайней мере, в том, что касается цитирования для повторного входа в оболочку. А printenvи envвовсе не о подставных переменных, хотя они делают часто совпадают с переменными окружения.
mikeserv
3

С помощью zshвы можете использовать typeset, что дает больше информации, чем set, например, тип переменных. Вы по-прежнему можете фильтровать вывод с помощью grepили sed, в зависимости от того, что вы хотите. Переменные среды помечены как exportedв выходных данных.

vinc17
источник