变量没有被回应

时间:2009-03-20 07:40:36

标签: linux bash

当我在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 个答案:

答案 0 :(得分:5)

  • 您首次输入UID == 1000,输入if子句
  • 你sudo用UID == 0执行脚本; 如果在/ etc / sudoers中设置了env_reset,则sudo 不会保留环境(在大多数发行版中都是默认值)。您需要 sudo -E 来保存环境
  • 退出(在回显之前

来自sudo,你输入干净的环境。

  • 您使用UID == 0
  • 输入
  • 您没有输入if子句,未设置var2
  • 你回应变量。

答案 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)也有帮助; - )