Какова область "экспортируемых" переменных оболочки Unix?

Я установить некоторые переменные окружения следующим образом:

MY_VAR='helloworld'
export MY_VAR

затем я переключился на другого пользователя через

su SOME_OTHER_USER

Я повторяю переменную MY_VAR.. и я вижу в этом ценность!

1) не могли бы вы объяснить этот вопрос. Насколько я понимаю, когда я экспортирую переменную через команду export, это не "глобальный" экспорт, а просто локальная пользовательская переменная. Почему я вижу это?

2) Изначально у меня было предположение: может быть, когда я переключиться на другого пользователя я запустите некоторый дочерний процесс моего процесса bash, и поэтому я вижу свою переменную, потому что экспортированные vars передаются любому дочернему процессу текущей оболочки. Но команда ps ---pid <my bash's pid which I got with echo $$> показывает только тот же pid в выходных данных. Таким образом, похоже, что это означает, что нет дочерних процессов, связанных с моим процессом bash, и su не запускает никакого процесса. Я прав?
(кстати, я не вижу ни одного "ребенка" таким образом, даже если я начну еще один Баш с командой bash, я не знаю, почему)

3) и наконец, кто может видеть переменная i экспортировали таким образом? Дал Я запустить другой процесс с моей ОС с GUI - я увижу его? Похоже, нет, потому что, если я начну другой терминал, я не увижу его там. Итак, какова область действия и время существования экспортируемой переменной?

Я использую Debian Wheezy. Я запускал свою команду из RootTerminal под пользователем Root.

5
задан MiamiBeach
источник

2 ответов

  • хорошо, для начала, я думаю, ты имеешь в виду ps --pid, а не ps ---pid.
  • не нужно echo $$ а затем введите число в ps --pid number; это достаточно хорошо, чтобы набрать ps --pid $$.  Если только ты не говоришь о

    # echo $$
    42
    # su joe
    % ps --pid 42
    

    в этом случае вы поступаете правильно.

  • чем вы ожидали?

    --pid процессы

      выбрать процесс ИДЕНТИФИКАТОР.  Идентично - p и p.



    - p процессы

      выбрать по PID.  При этом выбираются процессы, идентификаторы которых отображаются в процессы.  Идентично p и --pid.

    Итак, когда вы делаете ps --pid PID_of_shell, вы получаете строку psС выход только для процесса оболочки.  Вы можете найди ps -l | grep PID_of_shell более полезным; он покажет любую строку, содержащую PID_of_shell в любом месте, в том числе в столбце PPID.  То есть, он покажет дочерние процессы оболочки.  Но, конечно же,grep 42 найдете такие вещи, как 7428.

  • ваше предположение верно; переменные среды передаются от родителя к ребенку.  Как указано выше,su Shell-это ребенок Вашего логина оболочки (или другой родительской оболочки).  Обратите внимание, однако, что процесс может изменение среды; sudo несколько печально для этого, и su тоже (например, изменяется $USER,$LOGNAME и $HOME если вы не укажете --preserve-environment, и даже больше, если вы укажите --login).  Кроме того, процесс может передавать своим детям другую среду чем тот, который он использует; оболочка делает это, когда вы говорите что-то вроде PAGER=cat man man_page_topic.  Рекомендации:1,2.
  • так, нет, если вы установите (импорт) переменную среды в оболочке в одном терминале, а затем запустить другой терминал через оконный менеджер, он не будет видеть переменную окружения, потому что он не является дочерним (или потомка) оболочки, которая его установила.  Но, если вы запустите новое окно терминала из командной строки (например, by xterm&), затем это окно терминала унаследует среду оболочки.
3
отвечен Scott 2017-04-13 12:37:10
источник

было бы легче понять, если бы вы обращались к машине с ssh, rlogin или telnet, даже как тот же пользователь. (rlogin/telent не рекомендуется)

Если вы установите и экспортируете переменную из tty1 как пользователь foo, любой дочерний процесс сможет увидеть переменную и ее значение. Но если начать совершенно новую сессию, то есть. из tty2, как пользователь Foo переменная не будет видна.

1) Когда вы экспортируете переменную, вы делаете ее глобальной (в контексте сеанса). В качестве примечания, Я настоятельно не рекомендую использовать работу в" корневой " оболочке. Ошибки и несчастные случаи гораздо менее прощают, когда выполняются этим пользователем / учетной записью.

2) команда su является утилитой пользователя set (или switch). Вы все еще на своем первоначальном сеансе. Вот почему вы все еще можете видеть экспортированную переменную.

3) объем текущей сессии и время жизни какое-то время (пока вы не выйдете, если вы не сбросить или изменить переменную). Если вы порождать новые xterms от родительской сессии, дети по-прежнему видеть ваш экспортируемую переменную. При запуске новых сеансов/терминалов переменные и их значения из других tty не отображаются.

0
отвечен Daniel Liston 2017-08-06 20:33:18
источник

Другие вопросы bash environment-variables linux shell unix