我想在某个点之后抑制子 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