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


348

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

Включая не только $HOMEи $PWDт. Д., Но и любые другие, которые вы определили.



Вы приняли неправильный ответ. «printenv» дает только переменные окружения. Если вы действительно хотите, чтобы все переменные, объявленные в настоящее время в вашей оболочке, использовали «Declare -P» или «Typeset -P».
Флорин Андрей

Ответы:


479

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

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

printenv

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


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

( set -o posix ; set ) | less

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

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


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

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

( setopt posixbuiltin; set; ) | less

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


14
Если я иду к терминалу и пишу MYNEWVARIABLE=Ubuntuи выполняю, printenvон там не отображается. Почему это так, и как появляются эти другие?
Страпаковски

4
Возможно, вы видите разницу между переменной оболочки и переменной окружения. Попробуйте, export MYNEWVARIABLE=Ubuntuи это будет работать, как вы ожидаете.
Rmano

3
если вы просто выполняете set, он также перечисляет созданную вами переменную. Или сделайset | grep myvar
Сергей Колодяжный

4
printenvявляется внешней командой, поэтому она знает только (и печатает) экспортированные переменные окружения. setявляется внутренней командой bash, поэтому она показывает все «переменные оболочки» (неэкспортированные переменные среды), а также экспортируемые переменные среды.
Дэн Притц

1
Чтобы расширить ответ @ Rmano на @Strapakowsky ... Это не будет работать unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW, но это будет unset MYNEWVARIABLE; export MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW, и это будет unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu printenv | grep MYNEW. Использование экспорта говорит: «переменная, которую я устанавливаю, должна быть частью среды, которая передается процессам, а не просто переменной в этой оболочке». В третьем примере говорится, что «переменная должна быть частью среды, которая передается в ЭТОТ процесс, а не задерживаться потом».
Бруно Броноски

52

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

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

  • запустить терминал
  • показать переменные окружения , используя 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файлы. Так что теперь я найду это быстрее (и в процессе, я надеюсь помочь кому-то еще ...)


Требуется, чтобы у вас была среда рабочего стола, не полезная для людей, работающих только с CLI.
K7AAY

5
Да --- но тогда для CLI только предыдущий ответ в порядке. Я просто указывал, что иногда вам нужно проверять переменные среды, доступные для приложения, запускаемого графической средой, который отличается от набора, который вы видите, когда запускаете в нем терминал. Например, если вы пытаетесь понять, почему ваше приложение Kile не может скомпилировать файл LaTeX, а в терминале вы можете, трюк, который я выложил здесь, очень поможет.
Rmano

3
Спасибо за очень полезный ответ! Я только что связался с этим от help.ubuntu.com/community/…
Гуннар

Благодарю. Вы рекомендовали, xterm -e bash --noprofile --norcпотому что файлы запуска не читаются и не запускаются при запуске Ubuntu с графическим интерфейсом? См. Askubuntu.com/q/1025845/1471
Тим

1
правильная команда для выполнения в настоящее время (Ubuntu 18.04)gnome-terminal -- bash --noprofile --norc
Майк Накис

45

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

declare -p

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

declare -xp

Запустите, help declareчтобы увидеть другие варианты.


это далеко не решение аккуратного-эр , чем POSIXLY_CORRECT=1 setи это также стоит упомянуть , что declareесть alias(в этом контексте) для typeset, других Баша встроенных команд.

1
Это правильный ответ.
Флорин Андрей

12

Чтобы вывести список переменных среды в терминале с 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 пропускает некоторые переменные o_O. особенно после поиска файла VAR = VAL.
ThorSummoner

1
@ThorSummoner Ответ здесь может помочь stackoverflow.com/questions/15474650/...
georaldc

7

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

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

2
Это должен быть принятый ответ, так как все остальные перечисляют не только само имя. В моем случае некоторые переменные содержат многострочные значения, что делает другие решения неосуществимыми.
Мене

1
Вариант:compgen -v | while read line; do declare -p $line; done
Eljay

4

Большинство решений здесь либо печатают только переменные окружения, либо имеют недостаток, заключающийся в том, что 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.


1
Отличный первый ответ! +1 Продолжайте в том же духе!
Fabby

3

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


Уже упоминалось два года назад: askubuntu.com/a/276162/158442
Муру

@ Муру достаточно справедливо. Жаль, что он стал envболее заметным благодаря лучшему форматированию, и я добавил больше информации.
Сиро Сантилли 新疆 15: 中心 法轮功 六四 事件


2

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


0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.