Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用set-e,退出命令的状态!在if块中丢失_Bash - Fatal编程技术网

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
}