我试图捕获命令的错误代码,并将命令的输出赋给if语句中的变量。我的代码看起来像这样:
if ! ret=$(<some_command>); then
rc=$?
echo "<some_command> returned with exit code: $rc"
echo "$ret"
fi
字符串
在这里,我想将命令的输出分配给ret
,并仅将<some_command>
的错误代码分配给rc
。因为这个脚本有set -e
,我不能单独运行这个命令。一旦命令失败,脚本就会退出,但我不想退出脚本,而是将错误代码和错误放入变量中。如何让这个工作?
4条答案
按热度按时间uidvcgyl1#
set -e
在这里是一个非问题:它的行为在if
内部和任何其他“检查”上下文中被禁用;!
是导致你退出状态被抑制的原因。去掉
!
,将错误处理移到else
子句中:字符串
...或者,也许更习惯(如
||
在命令的退出状态上分支 * 也 * 将其标记为选中并抑制set -e
):型
z9smfwbn2#
!
命令只是否定当前退出代码。例如,在!false
之后,$?
的值将为0。在这种情况下,rc
将始终为0。要检索退出代码以供以后处理,必须在执行命令后收集它。如果你真的坚持使用
set -e
,IMO是一个坏主意,你可以这样做:字符串
vc6uscn93#
我同意这里的共识--通常不要使用
set -e
。可以考虑使用trap,例如this。
第二,most bash对条件的检查将“消耗”“异常”。我相信有更好的术语,但是你自己去测试一下;如果你立即检查失败,像
set -e
或trap
这样的东西通常不会看到失败,你可以显式地处理它。user 1934428的solution使用双管道来执行此操作,以显式地检查退出状态并在失败时设置值。
要小心-即使只是为了 * 成功 * 而测试也可能产生这种效果。见下文。
字符串
cmd
阵列只是确保echo
不必单独维护的一种简单方法。运行它看起来像这样:
型
希望能帮上忙。
附录
我们完全没有解决输出捕获,但你似乎有;我完全同意避免使用“not”(
!
)可能更好。8ftvxx2r4#
试试这个Shellcheck-clean代码:
字符串
printf
替换echo
。echo "$var"
一般不工作。