抑制子 shell 中的错误?

抑制子 shell 中的错误?

我想在某个点之后抑制子 shell 中的错误。

我写了脚本来演示这种情况:

worked=false
(echo Starting subshell process \
    && echo If this executes process is considered success \
    && false \
    && echo run if possible, but not an error if failed) \
  && worked=true

echo $worked

我想向外壳报告该过程有效。

我还考虑过将工作变量放入子 shell 中:

    && echo This works process worked: \
    && worked=true \
    && false \
    && echo run if possible, but not an error if failed)

但这也不起作用,因为在子 shell 内设置变量不会影响主脚本。

答案1

这个怎么样

worked=false
(
    set -e
    echo Starting subshell process
    echo If this executes process is considered success
    false
    echo run if possible, but not an error if failed || true
)
[[ 0 -eq $? ]] && worked=true

echo "$worked"

set -e一旦发现不受保护的错误,就会终止子 shell 。该|| true构造保护可能失败的语句,您不希望子 shell 终止。

如果您只想知道子 shell 是否成功,您可以$worked完全省略该变量

(
    set -e
    ...
)
if [[ 0 -eq $? ]]
then
    echo "Success"
fi

请注意,如果您想set -e在命令失败时立即中止子 shell 中的执行,则不能使用诸如( set -e; ... ) && worked=true或 之类的构造if ( set -e; ...); then ... fi。这在手册页中有记录,bash但我第一次错过了它:

如果复合命令或 shell 函数在被忽略的-e上下文中执行时设置-e,则在复合命令或包含函数调用的命令完成之前,该设置不会产生任何效果。

答案2

worked=false
(status=1;
    echo Starting subshell process \
    && echo If this executes process is considered success \
    && status=0
    && false \
    && echo run if possible, but not an error if failed;
    exit $status) \
  && worked=true

echo $worked

答案3

您可以将强制命令放在 an 的条件下if,无需将所有内容都用&&链连接:

worked=false
(   if echo Starting subshell process &&
       echo If this executes process is considered success ; then
        false &&
        echo run if possible, but not an error if failed
        exit 0
    fi
    exit 1 ) && worked=true

echo worked=$worked

答案4

我的解决方案是在子 shell 内创建一个变量,并根据该变量手动控制退出代码:

worked=false
(echo Starting subshell process \
    && echo If this executes process is considered success \
    && check=true \
    && false \
    && echo run if possible, but not an error if failed
  if [[ -n "$check" ]]; then exit 0; else exit 1; fi) \
  && worked=true

echo $worked

相关内容