Как перечислить все имена переменных и их текущие значения?

Как перечислить все имена переменных и их текущие значения?

В том числе не только $HOME, $PWD и т.д., но любой другой, который вы определили.

11 ответов

Решение

Для bash: (стандартная оболочка в Ubuntu)

Введите следующую команду в терминале, чтобы напечатать все переменные среды:

printenv

Для получения дополнительной информации об этой команде прочитайте printenv справочная страница.


Чтобы показать список, включающий "переменные оболочки", вы можете ввести следующую команду:

( set -o posix ; set ) | less

Это покажет вам не только переменные оболочки, но и переменные среды.

Для получения дополнительной информации, связанной с этой темой, прочитайте:


Для zsh: (расширенная оболочка)

Используйте следующую команду:

( setopt posixbuiltin; set; ) | less

Для получения дополнительной информации о параметрах ZSH см. zshoptions справочная страница.

Вы можете увидеть все переменные с declare встроенный.

declare -p

Если вас интересуют только переменные окружения, используйте

declare -xp

Бежать help declare чтобы увидеть, каковы другие варианты.

Я знаю, что этот вопрос довольно старый и на него дан ответ, но я думаю, что могу добавить немного полезной информации.

Во всех описанных выше методах предлагается следующая процедура:

  • запустить терминал
  • показать переменные среды, используя env, или жеprintenv или что угодно

Проблема этих решений в том, что вы видите переменные среды оболочки, которая работает в терминале. Вы не видите переменные среды, доступные для запуска приложения, например, непосредственно через графический интерфейс.

Это заметно, если, например, вы используете ~/.profile, или же .bashrc, или же .zshenv (в зависимости от вашей оболочки) для изменения переменных среды - как классическое добавление каталогов к пути.

Чтобы увидеть переменные среды, доступные приложению, запущенному непосредственно в графической среде, вы можете сделать следующее (в Gnome Shell я уверен, что во всех остальных DE есть эквивалентный метод):

  • нажмите Alt-F2
  • запустить команду xterm -e bash --noprofile --norc

(Или, если у вас нет xterm, gnome-terminal -- bash --noprofile --norc --- спасибо @Mike Nakis за комментарий).

Теперь у вас есть терминал с оболочкой, который не добавляет никаких переменных среды. Ты можешь использовать env здесь, чтобы перечислить все ваши переменные среды:

Пример голой оболочки

Очевидно, что новая оболочка будет иметь переменные среды, добавленные системными файлами, но эти переменные должны быть доступны (по наследству) для всех программ в системе в любом случае.

Я публикую это, потому что уже четвертый раз мне приходится снова искать этот трюк, проверяя .pam_environment файл. Так что теперь я найду это быстрее (и в процессе, я надеюсь помочь кому-то еще...)

В bash с использованием compgen:

compgen -v | while read line; do echo $line=${!line};done  

Для отображения переменных окружения в терминале с помощью CTRL+ALT+T вы можете использовать env команда.

например:

[raja@localhost ~]$ env
XDG_VTNR=1
SSH_AGENT_PID=3671
XDG_SESSION_ID=3
HOSTNAME=localhost.localdomain
IMSETTINGS_INTEGRATE_DESKTOP=yes
GPG_AGENT_INFO=/home/raja/.gnupg/S.gpg-agent:3691:1
GLADE_PIXMAP_PATH=:
TERM=xterm-256color
SHELL=/bin/bash
XDG_MENU_PREFIX=xfce-
DESKTOP_STARTUP_ID=
HISTSIZE=1000
XDG_SESSION_COOKIE=0250277dd805498381e96c05d88068b0-1364679772.845276-1676152201
WINDOWID=65011716
GNOME_KEYRING_CONTROL=/home/raja/.cache/keyring-N3QoQ2
IMSETTINGS_MODULE=none
QT_GRAPHICSSYSTEM_CHECKED=1
USER=raja

и т.п.

надеюсь, это поможет.

Большинство решений здесь либо печатают только переменные окружения, либо имеют недостаток, заключающийся в том, что env или (set -o posix; posix) не печатают значения в разбираемой форме (попробуйте вывести переменную A=$'a\r\nb'...),

Вот функция, которая будет печатать все переменные, по одной переменной на строку, в экранированной форме POSIX:

function dump_vars {
    local VARNAME
    compgen -v | while read -r VARNAME; do
        printf "$VARNAME=%q\n" "${!VARNAME}"
    done
}

Спасибо @tmgoblin за указание на использование compgen -v.

Если вы хотите конкретную переменную среды, а не печатать их все с printenvВы можете, например, распечатать его, выполнив echo "$PWD"

  • printenv покажет все глобальные переменные среды
  • env, глобальная переменная среды после изменения входа в систему
  • set, отобразит все локальные переменные среды относительно сеанса (обычно локальная переменная - это глобальная + конкретная для сеанса)

env - это способ POSIX 7:

export asdf=qwer
env | grep asdf

Образец вывода:

asdf=qwer

Он показывает только экспортированные переменные: неэкспортированные переменные обычно не считаются "переменными среды".

Предпочитаю, чтобы printenv, который не POSIX. Кажется, что оба делают одно и то же без аргументов: https://unix.stackexchange.com/questions/123473/what-is-the-difference-between-env-and-printenv

printenv только перечисляет экспортируемые переменные,команда+alt+$("\ e $": полная переменная) перечислит все переменные.

Скрипт для сброса всего, сортировки и выделения всех переменных $ENVS и $variables, объявленных в сеансе.

      #!/bin/bash
temp="$(mktemp)"
declare > $temp
printenv >> $temp;
sort -u $temp -o $temp;
grep --color=auto -E '^[A-Za-z_]+[^=]+' $temp 
rm -i $temp
Другие вопросы по тегам