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

如何在shell中su和运行python脚本?,python,shell,exit,Python,Shell,Exit,我想做的是,当我的python脚本(由shell运行)异常退出时,让我的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.p

我想做的是,当我的python脚本(由shell运行)异常退出时,让我的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
#shell脚本

su ossadm您需要引用
EOF
令牌。否则,here文档中的变量将由原始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
#shell脚本

su ossadm根据您的外壳,您可以尝试类似的方法

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
其中
b.sh
在su命令(在您的python脚本中)以代码“0”退出时运行
c.sh
在su命令(在您的python脚本中)退出时运行,代码为“1”

最后一个示例中,
echo$?
成功,因此下一行的
$?
为0。为什么直接运行
main.pyc
?加速(特别是在这种情况下)是可以忽略不计的,它不会反映您在未明确重新编译它的情况下对
main.py
所做的任何更改。@chepner说实话,这是因为我的公司希望我这样做..为了防止用户如此直接地访问源代码,尽管我们都知道这没有帮助,但在运行脚本之前可能打算展开
$SRC_DIR
,因此引用
EOF
可能不是正确的答案。然后需要导出它。我已经添加了这方面的信息。
su ossadm -c '. /opt/oss/manager/bin/engr_profile.sh;
python "${SRC_DIR}"/main.pyc' && /tmp/b.sh || /tmp/c.sh