如何在 shell 中使用 su 和 运行 python 脚本?

How to su and run python script in shell?

我想做的是让我的 shell 脚本在我的 python 脚本(即 shell 的 运行)异常退出时停止。但是我必须 su 到 ossadm 到 运行 python 脚本,当我 su

时如何获得正确的退出代码

这是我的代码:

# shell script
    su ossadm <<EOF
    . /opt/oss/manager/bin/engr_profile.sh # which only can be executed by ossadm
    python ${SRC_DIR}/main.pyc
    echo $?
    if [[ $? = 0 ]]; then
        echo "success"
    else
        echo "failure: $?"
    fi
EOF

# main.py
def main():
    sys.exit(1) # for testing

然后 运行 脚本,它总是打印 "0""suceess",或者更改顺序:

    su ossadm <<EOF
    . /opt/oss/manager/bin/engr_profile.sh # which only can be executed by ossadm
    python ${SRC_DIR}/main.pyc
EOF
    echo $?
    if [[ $? = 0 ]]; then
        echo "success"
    else
        echo "failure: $?"
    fi

# main.py
def main():
    sys.exit(1) # for testing

这个会给我更奇怪的“1”和"success"。

这种处理可以在shell脚本中完成吗?

您需要引用 EOF 令牌。否则,here-doc 中的变量将由原始 shell 扩展,因此 $? 包含 运行 在 su 之前的最后一个命令的退出状态。

# shell script
su ossadm <<'EOF'
    . /opt/oss/manager/bin/engr_profile.sh # which only can be executed by ossadm
    python "${SRC_DIR}"/main.pyc
    status=$?
    echo $status
    if [[ $status = 0 ]]; then
        echo "success"
    else
        echo "failure: $?"
    fi
EOF

如果 SRC_DIR 是原始 shell 中设置的变量,请确保将其导出,以便 shell 运行 继承 su,因为它不再被原来的shell扩展。但如果它由 engr_profile.sh 设置,引用令牌将使其正确扩展。

您在第二个版本中获得 1success 的原因是 echo 语句根据其自身的成功设置 $?。如果要打印退出状态并对其进行测试,则需要将其保存在另一个变量中,就像我在上面对 status 变量所做的那样。

取决于你shell你可以尝试这样的事情。

su ossadm -c '. /opt/oss/manager/bin/engr_profile.sh; 
python "${SRC_DIR}"/main.pyc'  && echo "sucess" || echo "failure"

此处 -c 标志将 运行 命令作为 ossadm

其中 && 是合乎逻辑的,如果上一个命令成功,则其后的 运行 代码块。 如果前一个命令失败,|| 是此 运行s 之后的逻辑或代码块。

为了让事情更清楚,您可以将成功和失败的代码放在不同的文件中

su ossadm -c '. /opt/oss/manager/bin/engr_profile.sh;
python "${SRC_DIR}"/main.pyc' && /tmp/b.sh || /tmp/c.sh

其中 b.sh 运行s 当 su 命令(在您的情况下 python 脚本)以代码“0”退出 和。 c.sh 运行s 当 su 命令(在你的例子中 python 脚本)以代码“1”退出时