如何在shell中su和运行python脚本?
我想做的是,当我的python脚本(由shell运行)异常退出时,让我的shell脚本停止。但是,我必须su到ossadm才能运行python脚本,当我su时如何获得正确的退出代码 这是我的密码:如何在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
# 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