将python脚本退出代码传播到调用shell脚本

时间:2015-10-14 17:54:46

标签: python bash shell

如果有任何失败,我在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脚本失败。

编辑2

parsed_version=$(python parse-git-describe.py $describe_result; echo $?)
echo $parsed_version
echo $?

上面的bash脚本给出了以下输出:

1
0

请注意,脚本parse-git-describe.py与前面提供的python脚本相同。

编辑3

显然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很重要?

3 个答案:

答案 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时,当函数返回调用者时,变量和退出代码超出范围。如果您不希望这种情况发生,您的函数应该将值返回给调用者。