Bash 使用set-e,退出命令的状态!在if块中丢失
猜猜发生了什么事?Bash 使用set-e,退出命令的状态!在if块中丢失,bash,Bash,猜猜发生了什么事? RET将始终为0,无论some_命令返回非零值 这是故意的吗?我简直不敢相信。是的,这是设计的(与set-e无关)否定它前面的管道的退出状态。但是,管道组件的退出状态可以在变量中找到,例如: set -e if ! some_command; then RET=$? if [[ $RET == 255 ]]; then ...do something handling... fi fi 概念证明: set -e if ! some_command; th
RET
将始终为0,无论some_命令返回非零值
这是故意的吗?我简直不敢相信。是的,这是设计的(与set-e
无关)<代码>代码>否定它前面的管道的退出状态。但是,管道组件的退出状态可以在变量中找到,例如:
set -e
if ! some_command; then
RET=$?
if [[ $RET == 255 ]]; then
...do something handling...
fi
fi
概念证明:
set -e
if ! some_command; then
ret=$PIPESTATUS
# do something with ret ...
fi
正如oguz ismail所说,这是的结果代码>--由于它将失败状态转换为成功,并且只有一种可能的成功状态(零),因此它必然会丢失特定的失败代码。但是,您可以在不使用的情况下执行类似的操作代码>:
$ ! (exit 42)
$ echo $?,$PIPESTATUS
0,42
$
与PIPESTATUS
解决方案不同,它可以移植到非bash shell(它应该可以与任何POSIX shell一起使用)。(尽管正如oguz ismail所指出的,[[]]
条件表达式是不可移植的——如果[“$RET”=255],则可移植版本将是;然后
)使用case
可以节省您需要保存$?
:case$?在255);;esac
。由case
进行的比较是在内部完成的,而不是作为一个单独的命令来修改$?
的值。
set -e
some_command || {
RET=$?
if [[ $RET == 255 ]]; then
...do something handling...
fi
}