我有一个运行一系列 python 脚本的 bash 脚本。它总是运行所有这些,但如果任何脚本以失败代码退出,则以失败代码退出。至少那是我希望的。这里是 ...
#!/bin/bash
res=0
for f in scripts/*.py
do
python "$f";
res=$(( $res | $? ))
done
exit $res
我想在终端中将它作为 bash 命令运行,但我不知道如何替换exit,以便命令像失败的脚本一样失败,而不是退出终端。我怎么做?
用你的最后一行exit $res替换
$(exit ${res})
这将使用退出值退出生成的子shell,${res}并且因为它是最后一条语句,所以这也是脚本的退出值。
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
是不是真的,错误代码的值并不重要。然后我有另一个解决方案:
#!/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
#!/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 退出,这是一般错误。