Переменная не отображается - PullRequest
2 голосов
/ 20 марта 2009

Когда я запускаю следующий скрипт в Bash 3.2.48:

#!/bin/bash

export var1='var1'
echo "UID=$UID"

if [ x"$UID" != x"0" ]
then
    export var2='var2'
    while ! { sudo -v; }; do { sudo -v; }; done;
    sudo $0
    exit
fi

echo $var1
echo $var2

exit 0

Что я получаю в качестве вывода:

UID=1000
UID=0
var1

Почему var2 не экспортируется и не отображается? Я уверен, что тот же скрипт работал с более старыми версиями Bash.

Ответы [ 2 ]

5 голосов
/ 20 марта 2009
  • вы вводите первый раз с UID == 1000, вы вводите условие if
  • Вы должны выполнить скрипт с UID == 0; sudo не сохраняет среду , если env_reset установлен в / etc / sudoers (по умолчанию в большинстве дистрибутивов). Вам нужно sudo -E для сохранения env.
  • вы выходите ( перед эхом )

от звонка sudo, который вы вводите с чистым env.

  • вы входите с UID == 0
  • Вы не вводите условие if, var2 не установлено
  • вы повторяете переменные.
1 голос
/ 20 марта 2009

Ответ гораздо проще, чем кажется: вы никогда не повторяете эти переменные (когда не работает как root, очевидно), потому что вы уже выходите:))

Старайтесь избегать / минимизировать путаницу, добавляя более подходящие / лаконичные операторы отладки. Например, используйте одно эхо, которое содержит все , которое имеет отношение к вашей проблеме (то есть идентификатор процесса, идентификатор пользователя, var1, var2):

#!/bin/bash
export var1='var1'
if [ "$UID" != "0" ] ; then
    export var2='var2'
    while ! { sudo -v; }; do { sudo -v; }; done;
    sudo $0
    # this is "the key exit" ;-)
    #exit
fi
echo "pid=[$$] uid=[$UID] var1=[$var1] var2=[$var2]"

С закомментированным выходом вы получите то, что ожидаете (очевидно, в «родительском» процессе, так как «дочерний» - тот, который выполняется как «root» - никогда не достигает той части кода, которая экспортирует var2):

pid=[12346] uid=[0] var1=[var1] var2=[]
pid=[12345] uid=[1] var1=[var1] var2=[var2]

++ иногда запускает скрипты в режиме отладки (bash -x) тоже помогает; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...