庆典。 set -e;获得结果代码

时间:2014-05-13 02:52:00

标签: linux bash

如果我在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.

1 个答案:

答案 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