如何在 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
设置,引用令牌将使其正确扩展。
您在第二个版本中获得 1
和 success
的原因是 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”退出时
我想做的是让我的 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
设置,引用令牌将使其正确扩展。
您在第二个版本中获得 1
和 success
的原因是 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”退出时