我想做的是,当由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脚本中完成这种处理吗?
答案 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.sh
和1
的原因是因为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
运行