繁体   English   中英

出错时退出子shell

[英]Exit subshell on error

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

(
false
true 
) && echo "OK" || echo "FAILED";

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

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

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

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

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

(
set -e
false
echo "test"
) && echo "OK" || echo "FAILED"; 

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

编辑问题:

类似set -e的子壳。

好吧,你可以为子shell set -e

( set -e
my
commands
)

你不能让隐含只是你的子shell有errexit选项。 您可以使用eval做一些eval ,或者使用子进程作为shell(即使子进程与子shell不同),例如

errexit_shell() {
    bash -e
}

但由于各种原因,这些选项都是不可取的,其中最重要的是可读性。 在这种情况下,你最好的选择就是调整你的整个脚本以使用set -e ,你的子shell将会出现。

对于你原来的问题:

只需捕获指示成功或失败的部件的状态:

(
    cat teisatrt
    status=$?
    echo "true"
    exit "$status"
) && echo passed || echo failed

(当然,如果您只想知道该文件是否可读,请不要使用它,只需使用test -r 。)

bash的这种效果在一个条件表达式中 set -e foo || true foo || true ,是已知的,考虑的一个问题。 我认为一般都讨厌set -e和shell脚本是很好的理由。

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

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

 mkdir abc && cd abc && do_something_else && last_thing || { echo error >&2; exit 1; } 

一些重要的注意事项:您不需要尾随反斜杠。 您不缩进以下行。 你必须坚持每行80个字符,这样每个人都可以在最后看到“&&”或“||”。 如果你需要混合AND和OR,请使用不会产生子shell的{these braces}进行分组。

就像你拥有它一样,你将整个子shell的输出重定向到/ dev / null,所以你永远不会看到你的“真实”回声。 您应该将子shell中的重定向移动到您真正想要的命令。 为了在cat失败时退出子shell,你需要在cat运行后检查失败。 如果不这样做,那么正如您所指出的那样,其返回代码将被以下语句清除。 所以像这样:

echo "Installing App"
(
cat teisatrt &> /dev/null || exit 1
echo "true"
) && echo "OK" || echo "FAILED";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM