相当于在命令行退出

equivalent of exit on command line

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

#!/bin/bash

res=0

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

exit $res

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

Bash 没有匿名函数(例如 Go)的概念,您可以内联定义并获取 return 值,您需要明确地执行此操作。将整个代码包装在一个函数中,比如 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

将最后一行 exit $res 替换为

$(exit ${res})

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

是吗,错误代码的值无关紧要。那我还有一个解决办法:

#!/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 脚本 returns 一个错误代码 0,(这意味着它有效)一个 1 被回显到堆栈文件中。在循环结束时,检查堆栈是否存在单个 0,如果找到一个,则退出并返回错误代码 1,这是一般错误。