2

我有一个运行一系列 python 脚本的 bash 脚本。它总是运行所有这些,但如果任何脚本以失败代码退出,则以失败代码退出。至少那是我希望的。这里是 ...

#!/bin/bash

res=0

for f in scripts/*.py
do
  python "$f";
  res=$(( $res | $? ))
done

exit $res

我想在终端中将它作为 bash 命令运行,但我不知道如何替换exit,以便命令像失败的脚本一样失败,而不是退出终端。我怎么做?

4

4 回答 4

3

用你的最后一行exit $res替换

$(exit ${res})

这将使用退出值退出生成的子shell,${res}并且因为它是最后一条语句,所以这也是脚本的退出值。

于 2020-08-03T11:24:30.923 回答
2

Bash 没有匿名函数(例如 Go)的概念,您可以内联定义并获取返回值,您需要明确地执行此操作。将整个代码包装在一个函数中说f()

f() {
    local res=0
    
    for f in scripts/*.py
    do
      python "$f";
      res=$(( $res | $? ))
    done

    return $res
}

并在命令行中使用退出代码。

if ! f; then
    printf '%s\n' "one more python scripts failed"
fi
于 2020-08-03T11:07:50.070 回答
0

是不是真的,错误代码的值并不重要。然后我有另一个解决方案:

#!/bin/bash
total=0
errcount=0

for f in scripts/*.py
do
  let total++
  python "$f" || let errcount++
done

if ((errcount))
then
  printf '%u of %u scripts failed\n' $errcount $total >&2 
  exit 1
fi

exit 0
于 2020-08-03T11:29:44.780 回答
0
#!/bin/bash

for f in scripts/*.py
do
  python "$f" && echo "1" >> stack || echo "0" >> stack
done

[ $(grep -o stack) -eq 0 ] && rm -v ./stack && exit 1

我现在相当震惊,所以如果我误解了我很抱歉,但我相信这会满足你的需要。每次 python 脚本返回错误代码 0(这意味着它有效)时,都会将 1 回显到堆栈文件中。在循环结束时,检查堆栈是否存在单个 0,如果找到,则以错误代码 1 退出,这是一般错误。

于 2020-08-03T11:39:56.157 回答