如果有任何失败,我在python脚本(使用python 3.4)中有以下内容:
exit(1)
这个python脚本的目的是print()
一些值,以便它可以像这样分配给一个shell变量:
#!/bin/bash
set -e
result=$(python my-script.py)
echo $?
但是,如果脚本失败,则上面的echo
返回0.如果python脚本失败(即返回非零退出代码),我希望set -e
立即中断并使脚本失败。
我该如何使这项工作?我在我的bash脚本中尝试了set -eo pipefail
,我注意到没有区别。
我正在运行Ubuntu 15。
我的python脚本(逐字)以防万一在这里是嫌疑人......
import re
import sys
version_regex = r'(?:(?:release|hotfix)\/|^)([\d.]+)-\d+-g[a-f\d]+$'
result = re.search(version_regex, sys.argv[1])
if not result:
exit(1)
print(result.group(1))
请注意,我在实验中尝试了sys.exit(1)
和exit(1)
,但我从未看到我的bash脚本失败。
parsed_version=$(python parse-git-describe.py $describe_result; echo $?)
echo $parsed_version
echo $?
上面的bash脚本给出了以下输出:
1
0
请注意,脚本parse-git-describe.py
与前面提供的python脚本相同。
显然local
导致这种情况破裂。上面的编辑2是错误的,这是shell函数中local
的结果:
foo()
{
local parsed_version=$(python parse-git-describe.py $describe_result; echo $?)
echo $parsed_version
echo $?
}
结果是:
1
0
但如果我删除local
它可以正常工作吗?
foo()
{
parsed_version=$(python parse-git-describe.py $describe_result; echo $?)
echo $parsed_version
echo $?
}
结果是:
1
1
为什么local
很重要?
答案 0 :(得分:1)
如果您通过调用sys.exit(code)
完成脚本,则可以设置退出代码。
答案 1 :(得分:0)
local
只能在bash中的函数中使用。 (所以你上面的bash脚本代码也不起作用。)
为什么不在bash脚本中调用python脚本并检查返回值,然后在必要时跳出脚本?
$ python -c "exit(0)"
$ [ $? == 0 ] || echo "fail"
$ python -c "exit(1)"
$ [ $? == 0 ] || echo "fail"
fail
我猜你可以在shell脚本中轻松调整它。
答案 2 :(得分:0)
为什么
local
很重要?
local
关键字指定变量&#39> 范围。以下示例脚本应说明:
#!/bin/bash
HELLO=Hello # global variable, HELLO
function hello {
local HELLO=World # local variable with same name; diff scope
echo $HELLO # this is the local, not global!
}
echo $HELLO # print global
hello # function call!
echo $HELLO # global unchanged!
从shell运行此代码(放在test.sh
脚本中)会产生:
➜ Projects ./test.sh
Hello
World
Hello
使用local
时,当函数返回调用者时,变量和退出代码超出范围。如果您不希望这种情况发生,您的函数应该将值返回给调用者。