出错时退出子shell

Lor*_*rof 8 bash

我目前正在使用这样的东西:

(
false
true 
) && echo "OK" || echo "FAILED";
Run Code Online (Sandbox Code Playgroud)

它不起作用.如果某些内容失败,我希望子shell退出并返回错误(在这种情况下为false).目前只有在最后一个命令失败时才会失败.

它应该只退出当前的子shell而不是整个脚本.

我将这个脚本提供给人们,我不希望他们看到所有的输出,但如果脚本成功与否,仍然会给他们某种响应.

编辑:上面的子shell中的命令只是一个例子.我想在子shell中运行多个命令,而不检查每个命令后的返回值.类似set -e的子壳.

Edit2:我尝试在子shell中添加set -e.也许我做错了但它并没有改变我的脚本的行为.它没有使用非0代码停止执行或退出子shell.

(
set -e
false
echo "test"
) && echo "OK" || echo "FAILED"; 
Run Code Online (Sandbox Code Playgroud)

首先打印测试,然后确定.它应该因为错误而打印FAILED.

sou*_*edi 7

bashset -e 在像 foo || true,这样的条件表达式中的这种效果是已知的并且被认为是一个问题。我认为有充分的理由同时讨厌set -e和 shell 脚本。

第一个链接提出以下建议。它在小例子中看起来不错,但在现实世界中可能不太清楚。

通过将一系列带有“&&”的命令串在一起来进行自己的错误检查,如下所示:

mkdir abc &&
cd abc &&
do_something_else &&
last_thing ||
{ echo error >&2; exit 1; }
Run Code Online (Sandbox Code Playgroud)

一些重要的注意事项: 您不需要尾部反斜杠。您不缩进以下行。您必须坚持每行 80 个字符,以便每个人都可以看到“&&”或“||” 在末尾。如果您需要混合 AND 和 OR,请使用不会产生子外壳的 { 这些大括号 } 进行分组。