当子命令出错时,如何解决 Bash 循环不退出的问题?

当子命令出错时,如何解决 Bash 循环不退出的问题?

我在 shell 脚本中有一个 for 循环:

#!/bin/bash
set -u
set -e
for l in sh rb py php java cs; do
  (cd $l; ./run-tests.sh)
done

目的是当任何一个子命令同样出错时让 for 循环终止。

现在,我有一个解决方法:(cd $l; ./run-tests.sh) || die "Message here"以及 的适当定义die。但是,我真的很好奇为什么 for 循环不会按照“set -e”命令设置的期望自行终止?理想情况下,我不希望每个 for 循环都像这样特殊化。:)

答案1

set -e如果失败则不会立即退出,原因./run-test.sh是:

for l in sh rb py php java cs; do
  (cd $l; ./run-tests.sh)
done

对于复合语句。此复合语句的状态是 的最后一次运行的状态./run-tests.sh

您的工作对我来说听起来不错。

答案2

我没有评论权限,所以在这里发帖。这取决于 run-tests.sh 中的脚本。你确定这会给出一个非零值吗:

./运行测试.sh

回显 $?

相关内容