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

时间:2018-09-25 15:42:36

标签: python shell exit

我想做的是,当由shell运行的python脚本异常退出时,让我的shell脚本停止运行。但是我必须使用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”和“成功”。

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

2 个答案:

答案 0 :(得分:2)

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

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运行的外壳程序继承,因为它将不再被原始外壳程序扩展。贝壳。但是,如果它是由su设置的,则引用令牌将使其正确展开。

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

答案 1 :(得分:1)

根据您的外壳,您可以尝试这样的事情。

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

这里-c标志将以ossadm的身份运行命令。

&&是逻辑上的位置,如果先前的命令成功执行,则在此之后运行代码块。 如果先前的命令失败,||就是逻辑或代码块运行之后。

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

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

以代码“ 0”退出su命令(在您的情况下为python脚本)时b.sh在何处运行 和。当su命令(在您的情况下为python脚本)以代码“ 1”退出时,c.sh运行