Когда я проверяю среду моей системы, появляется много переменных среды. Как я могу просто найти конкретную переменную?
Книга, которую я читаю, говорит:
Иногда количество переменных в вашей среде становится достаточно большим, настолько, что вы не хотите видеть все значения, отображаемые, когда вас интересует только одна. Если это так, вы можете использовать
echo
команду, чтобы показать текущее значение переменной среды.
Как мне сделать это в терминале Linux?
command-line
environment-variables
iLearnSlow
источник
источник
echo
плохой выбор команды, поскольку он может преобразовать содержимое переменной. Он выведет содержимое параметра оболочки с тем же именем. Это не обязательно то же самое при использовании Bourne оболочки или окр вары , как1
,*
например. И вы не можете использовать этот подход для переменных env, чье имя недопустимо в качестве имени переменной оболочки.printenv VAR
отобразит их все (по крайней мере, для реализации GNU).Выполняя:
printenv
Вы увидите все переменные среды. Для получения дополнительной информации вы можете взглянуть на:
https://www.digitalocean.com/community/tutorials/how-to-read-and-set-environmental-and-shell-variables-on-a-linux-vps
источник
printenv
variablename
будет отображаться только именованная переменная; Например,printenv HOME
будет делать примерно то же самое, что иecho "$HOME"
.Важно понимать, что у каждого процесса есть свой набор переменных среды.
Когда процесс вызывает
fork()
системный вызов, создается второй процесс ( дочерний ), идентичный первому ( родительский ) (эта копия включает среду, которая находится чуть выше стека (или чуть ниже), в зависимости от того, как вы думаете о стеках:-)
- но в Unix / Linux стек растет вниз от высоких адресов).Обычно дочерний процесс вызывает
execve()
системный вызов, который отбрасывает все в своей (виртуальной) памяти и восстанавливает его из разделов кода и данных в указанном двоичном файле.Однако, когда он восстанавливает стек, он копирует окружение и строки аргументов, переданные
execve()
в стек сначала (в указанном порядке), прежде чем вызыватьmain()
функцию (большая часть работы выполняется вcrt0
коде начальной загрузки послеexecve()
возврата (к записи). точка указана в двоичном виде)).В
execve()
библиотеке C есть обертки для системного вызова, которые передают текущую среду (т. Е. Копию родительской среды), а не вызывающую ее вызывающую (так что в действительности дочерний процесс наследует родительскую среду) - смотритеenviron(7)
.Попробуйте запустить (как root) команду
ps axeww | less
... это покажет вам среду для всех процессов! Интересным является процесс с идентификатором 1 (т.е.init
процесс - первый процесс, созданный ядром во время загрузки).Если вы хотите посмотреть на среду для определенного процесса (и знаете, что это идентификатор процесса), попробуйте выполнить команду
cat /proc/<PID>/environ
(заменив<PID>
ее идентификатором процесса).Обратите внимание, что если процесс имеет достаточные привилегии, он может переписать свой собственный стек, что может затруднить понимание его среды - вы увидите некоторые процессы-демоны, подобные этому, в выводе ps.
Но, в конце концов, вся эта вафля сводится к тому, что @chaos сказал выше, если вы хотите посмотреть текущее значение определенной переменной среды в вашем процессе оболочки, просто используйте (встроенную) команду
echo "$<NAME>"
(заменив<NAME>
ее именем переменная окружения, которая вас интересует) ... просто имейте в виду, что одна и та же переменная может иметь другое значение или не существовать вообще в другом процессе.источник
e
опцияps
и/proc/…/environ
специальный файл могут существовать не во всех системах. (2) AFAIK, каждый процесс Unix имеет право переписывать свой стек и изменять переменные окружения. (3) Для получения дополнительной информации см. К кому относятся переменные среды? (на Супер пользователя ).ps
… но теперь, когда вы подчеркнули этот момент, я не могу вспомнить, почему я думал, что.Вы можете получить то, что вы ищете с
export
:Покажет содержимое
$HOME
переменной.источник
если вам нужно установить много переменных:
после установки их:
чем показать, что было установлено:
Таким образом, вы скоро окажетесь, работая с несколькими наборами переменных оболочки, предварительно определенными в файлах cnf, что в сочетании с tmux сделает вас мастером управления конфигурациями в средах оболочки:
источник