当我在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版本。
答案 0 :(得分:5)
来自sudo,你输入干净的环境。
答案 1 :(得分:1)
答案比看起来简单得多:你从不回应那些变量(当b 不以root身份运行时,显然),因为你已经退出:))< / p>
尝试通过添加更合适/简洁的调试语句来避免/减少混淆。例如,使用包含与您的问题相关的所有的单个回显(即进程ID,用户ID,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)也有帮助; - )