5

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

MY_VAR='helloworld'
export MY_VAR

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

su SOME_OTHER_USER

Я повторяю переменную MY_VAR .. и вижу ее значение!

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

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

3) Наконец, кто может видеть переменную, которую я экспортировал таким образом? Учитывая, что я запускаю какой-то другой процесс из моего графического интерфейса ОС - я собираюсь его увидеть? Похоже, нет, потому что, если я запускаю другой терминал, я не вижу его там. Так какова область действия и время жизни моей экспортируемой переменной?

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

2 ответа2

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

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

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

  • Чего ты ожидал?

    --pid pidlist

      Выберите по идентификатору процесса.  Идентичен -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 является дочерней для вашей оболочки входа в систему (или другой родительской оболочки).  Обратите внимание, однако, что процесс может изменить свою среду; sudo несколько печально известен тем, что делает это, и su тоже делает это (например, он меняет $USER , $LOGNAME и $HOME если вы не укажете --preserve-environment , и даже больше, если вы укажете --login).  Кроме того, процесс может передать своим дочерним элементам среду, отличную от той, которую он использует; оболочка делает это, когда вы говорите что-то вроде PAGER=cat man man_page_topic .  Рекомендации: 1 , 2 .
  • Таким образом, нет, если вы установите (экспортируете) переменную среды в оболочке в одном терминале, а затем запустите другой терминал через оконный менеджер, она не увидит переменную среды, поскольку она не является дочерней (или потомковой) переменной оболочка, которая его установила.  Но если вы запустите новое окно терминала из оболочки (например, с помощью xterm&), то это окно терминала унаследует среду оболочки.
0

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .