如果我在bash脚本中使用-e选项并且代码失败 - 我可以抓住它:
$ set -e; ( false; echo qwe; ) || echo qwe
qwe
但是,当我尝试获取返回代码时,我得到:
$ (set -e; ( false; echo qwe; ) || ret=$?; echo asd )
qwe
asd
为什么会发生以及我如何获得返回代码?
Vesion:
$ bash --version
GNU bash, версия 4.2.37(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
答案 0 :(得分:2)
set -e; ( false; echo qwe; ) || echo qwe
不符合你的想法:
包含 list 命令(( ... )
)的任何子shell(false; echo qwe
)将执行该列表中的所有命令并决定基于 last 命令的退出代码是否中止子shell(由于-e
);从echo qwe
开始,由于子shell的最后一个命令返回0
作为其退出代码(信令 succcess ),子shell返回0
整体 ,||
的右侧从未踢过;尝试使用不同的字符串来回应:set -e; ( false; echo qwe1; ) || echo qwe2
尝试在子shell 中设置一个变量(在本例中为ret
)以便在原始shell中进行访问总是没有意义,因为它的范围将仅限于子shell;要从子shell传递值 out ,请使用stdout
输出。
要实现目标,请忘记set -e
,而在子shell中使用|| exit
后缀每个命令,以便在发生故障时立即中止;离开子shell的退出代码将正确反映第一个失败的命令的退出代码,或0
,如果所有命令都成功:
output=$( false || exit; echo qwe || exit ) # capture output from subshell
ret=$? # $? reflects overall success of subshell