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


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

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


295
2018-03-30 00:36


происхождения


superuser.com/questions/420295/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


ответы:


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

printenv

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


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

( set -o posix ; set ) | less

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

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


417
2018-03-30 01:21



Если я пойду на терминал и напишу MYNEWVARIABLE=Ubuntu и выполнить printenv он не показывает. Почему это, и как появляются эти другие? - Strapakowsky
Вероятно, вы видите разницу между переменной оболочки и переменной окружения. Пытаться export MYNEWVARIABLE=Ubuntu и он будет работать так, как вы ожидаете. - Rmano
если вы просто выполните set, он также перечисляет переменную, созданную вами. Или сделать set | grep myvar - Sergiy Kolodyazhnyy
printenv является внешней командой, поэтому она знает только о (и печатает) экспортированные переменные среды. set является внутренней командой bash, поэтому она отображает все «переменные оболочки» (неэкспонированные переменные среды), а также экспортированные переменные среды. - Dan Pritts
Чтобы расширить ответ @ Rmano на @Strapakowsky ... Это не сработает unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW, но это будет unset MYNEWVARIABLE; export MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW, и это будет unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu printenv | grep MYNEW, Использование экспорта говорит, что «переменная, которую я устанавливаю, должна быть частью среды, которая передается процессам, а не только переменной в этой оболочке». В моем третьем примере говорится, что «переменная должна быть частью среды, которая передается этому процессу, но не прилипает после этого». - Bruno Bronosky


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

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

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

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

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

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

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

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

Example of the bare shell

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

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


43
2017-10-12 00:37



Требуется, чтобы у вас была среда рабочего стола, не полезная для серверных CLI-только для людей. - K7AAY
Да --- но тогда для CLI только предыдущий ответ в порядке. Я просто указывал, что когда-нибудь вам нужно проверить переменные среды, доступные для приложения, запущенного графической средой, которая не является тем же самым набором, который вы видите при запуске в нем терминала. Например, если вы пытаетесь понять, почему приложение Kile не может скомпилировать файл LaTeX, в то время как в терминале вы можете, трюк, который я разместил здесь, поможет много. - Rmano
Спасибо за очень полезный ответ! Я только что связался с ним из help.ubuntu.com/community/... - Gunnar Hjalmarsson
Благодарю. Вы порекомендовали xterm -e bash --noprofile --norc потому что файлы запуска не читаются и не выполняются при запуске Ubuntu с графическим интерфейсом? Видеть askubuntu.com/q/1025845/1471 - Tim
@Tim в основном это всего лишь способ иметь оболочку без каких-либо изменений, кроме переменных среды, доступных для графической среды. Стандартный терминал будет читать (или перечитывать) .bashrc например... - Rmano


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

declare -p

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

declare -xp

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


32
2018-04-04 20:28



это гораздо более четкое решение, чем POSIXLY_CORRECT=1 set и также стоит упомянуть, что declare является alias (в этом контексте) для typeset, другой bash builtin. - w17t


Чтобы перечислить переменные среды в терминале с помощью 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

и т.п.

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


11
2018-03-30 16:41



Я заметил, что env пропускает некоторые переменные o_O. особенно после поиска файла VAR = VAL. - ThorSummoner
@ThorSummoner Ответ здесь может помочь stackoverflow.com/questions/15474650/... - georaldc


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

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

3
2018-04-11 20:53



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


окр это POSIX 7-way:

export asdf=qwer
env | grep asdf

Пример вывода:

asdf=qwer

В нем отображаются только экспортированные переменные: не экспортируемые переменные обычно не рассматриваются как «переменные среды».

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


2
2017-11-30 14:31



Уже упоминалось два года назад: askubuntu.com/a/276162/158442 - muru
@muru достаточно справедливо. Хотелось бы, чтобы env более заметным с лучшим форматированием, и я добавил дополнительную информацию. - Ciro Santilli 新疆改造中心 六四事件 法轮功
Это то что редактирование для. - muru


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


0
2018-01-08 14:13