Як перелічити всі назви змінних та їх поточні значення?
У тому числі і не тільки $HOME
, і $PWD
т.д. , але будь-який інший ви визначили.
Як перелічити всі назви змінних та їх поточні значення?
У тому числі і не тільки $HOME
, і $PWD
т.д. , але будь-який інший ви визначили.
Відповіді:
Для bash: (стандартна оболонка в Ubuntu)
Введіть таку команду в термінал, щоб надрукувати всі змінні середовища:
printenv
Для отримання додаткової інформації про цю команду прочитайте сторінку printenv
man .
Щоб показати список, що включає "змінні оболонки", ви можете ввести наступну команду:
( set -o posix ; set ) | less
Це покаже вам не тільки змінні оболонки, але й змінні середовища.
Для отримання додаткової інформації щодо цієї теми читайте:
Для zsh: (вдосконалена оболонка)
Використовуйте таку команду:
( setopt posixbuiltin; set; ) | less
Для отримання додаткової інформації про параметри ZSH див. zshoptions
Сторінку man .
MYNEWVARIABLE=Ubuntu
та виконую, printenv
він там не відображається. Чому це так, і як вони показують інших?
export MYNEWVARIABLE=Ubuntu
і це спрацює, як ви очікуєте.
set
, він містить перелік створеної вами змінної. Або робитиset | grep myvar
printenv
це зовнішня команда, тому вона знає лише про (та друкує) експортовані змінні середовища. set
є внутрішньою командою bash, тому вона показує всі "змінні оболонки" (неекспортовані змінні середовища), а також експортовані змінні середовища.
unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW
, але це буде unset MYNEWVARIABLE; export MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW
, і це буде unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu printenv | grep MYNEW
. Використовуючи експорт, "змінна, яку я встановлюю, повинна бути частиною середовища, яке передається процесам, а не лише змінною в цій оболонці". У моєму третьому прикладі сказано, що "змінна повинна бути частиною середовища, яка передається ЦЕМУ процесу, але не залишатися навколо".
Я знаю, що це питання досить старе і відповів, але я думаю, що можу додати трохи корисної інформації.
У всіх описаних вище способах запропонована процедура:
env
або
printenv
або будь-який іншийПроблема цих рішень полягає в тому, що ви бачите змінні середовища оболонки, що працює в терміналі . Ви не бачите змінних середовища, доступних для програми, наприклад, безпосередньо за допомогою графічного інтерфейсу.
Це помітно, якщо, наприклад, ви використовуєте свій ~/.profile
, або .bashrc
, або .zshenv
(залежно від оболонки) для зміни змінних оточуючого середовища --- як класичне додавання каталогів до шляху.
Щоб побачити змінні середовища, доступні для програми, запущені безпосередньо у графічному середовищі, ви можете зробити наступне (у Gnome Shell, я впевнений, що існує еквівалентний метод у всіх інших DE):
xterm -e bash --noprofile --norc
(Або, якщо у вас немає xterm
, gnome-terminal -- bash --noprofile --norc
--- дякую @Mike Nakis за коментар).
Тепер у вас є термінал із оболонкою, який не додав змінних середовища. Ви можете використовувати env
тут, щоб перелічити всі змінні середовища:
Очевидно, що нова оболонка матиме змінні середовища, додані системними файлами, але ці змінні повинні бути доступними (за спадщиною) для всіх програм у системі в будь-якому випадку.
Я публікую це, тому що мені вже вчетверте потрібно знову шукати цей трюк, перевіряючи свій .pam_environment
файл. Тож зараз я знайду це швидше (і під час цього, сподіваюся, допоможу комусь іншому ...)
xterm -e bash --noprofile --norc
оскільки файли запуску не читаються та не виконуються, коли Ubuntu запускається з графічним інтерфейсом? Дивіться askubuntu.com/q/1025845/1471
gnome-terminal -- bash --noprofile --norc
Ви можете побачити всі змінні за допомогою declare
вбудованого.
declare -p
Якщо вас цікавлять лише змінні середовища, використовуйте
declare -xp
Запустіть, help declare
щоб побачити інші варіанти.
POSIXLY_CORRECT=1 set
це, і його також варто згадати, що declare
є alias
(у цьому контексті) для typeset
іншого башти.
Щоб перелічити змінні середовища в терміналі з 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
тощо.
сподівання, що допомагає.
У bash, використовуючи compgen:
compgen -v | while read line; do echo $line=${!line};done
compgen -v | while read line; do declare -p $line; done
Більшість рішень тут або друкують лише змінні середовища, або мають недолік, що 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.
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
env
більш помітною з кращим форматуванням, і я додав більше інформації.
printenv перелічує лише експортовані змінні, command+ alt+ $ ("\ e $": повна змінна) відображатиме список усіх змінних.