Як перелічити всі назви змінних та їх поточні значення?


348

Як перелічити всі назви змінних та їх поточні значення?

У тому числі і не тільки $HOME, і $PWDт.д. , але будь-який інший ви визначили.



Ви прийняли неправильну відповідь. "printenv" дає лише змінні середовища. Якщо ви справді хочете, щоб усі змінні, які зараз задекларовані у вашій оболонці, використовуйте "оголосити -p" або "typeset -p".
Флорін Андрій

Відповіді:


479

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

Введіть таку команду в термінал, щоб надрукувати всі змінні середовища:

printenv

Для отримання додаткової інформації про цю команду прочитайте сторінку printenvman .


Щоб показати список, що включає "змінні оболонки", ви можете ввести наступну команду:

( set -o posix ; set ) | less

Це покаже вам не тільки змінні оболонки, але й змінні середовища.

Для отримання додаткової інформації щодо цієї теми читайте:


Для zsh: (вдосконалена оболонка)

Використовуйте таку команду:

( setopt posixbuiltin; set; ) | less

Для отримання додаткової інформації про параметри ZSH див. zshoptionsСторінку man .


14
Якщо я заходжу до терміналу і пишу MYNEWVARIABLE=Ubuntuта виконую, printenvвін там не відображається. Чому це так, і як вони показують інших?
Страпаковський

4
Можливо, ви бачите різницю між змінною оболонки та змінною середовища. Спробуйте, export MYNEWVARIABLE=Ubuntuі це спрацює, як ви очікуєте.
Рмано

3
якщо ви просто виконаєте set, він містить перелік створеної вами змінної. Або робитиset | grep myvar
Сергій Колодяжний

4
printenvце зовнішня команда, тому вона знає лише про (та друкує) експортовані змінні середовища. setє внутрішньою командою bash, тому вона показує всі "змінні оболонки" (неекспортовані змінні середовища), а також експортовані змінні середовища.
Dan Pritts

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, призначеного лише для CLI.
K7AAY

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

3
Дякую за дуже корисну відповідь! Я щойно з цим зв’язався
Gunnar Hjalmarsson

Дякую. Ви рекомендували, 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 Продовжуйте гарну роботу!
Фабі

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
муру

@muru досить справедливо. Бажаю, щоб вона стала envбільш помітною з кращим форматуванням, і я додав більше інформації.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Ось для чого і редагування .
муру

2

Якщо ви хочете отримати певну змінну середовища, а не друкувати їх усі printenv, ви можете, наприклад, роздрукувати їїecho "$PWD"


0

printenv перелічує лише експортовані змінні, command+ alt+ $ ("\ e $": повна змінна) відображатиме список усіх змінних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.