在“if!somecommand”之后获取somecommand的退出状态

时间:2017-04-27 21:35:36

标签: bash

我似乎无法在Bash if条件中获取命令执行的退出代码:

#! /bin/bash

set -eu

if ! curl -sS --fail http://not-there; then
  echo "ERROR: curl failed with exit code of $?" >&2
fi

但当$?以非零退出时,curl始终返回零。

如果我没有在if条件中执行curl命令,那么我的$?会正确返回。

我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:2)

在原始代码中,$?返回的退出状态不是curl,而是! curl

要保留原始值,请选择不需要反转的控制结构:

curl -sS --fail http://not-there || {
  echo "ERROR: curl failed with exit code of $?" >&2
  exit 1
}

......或类似的东西:

if curl -sS --fail http://not-there; then
  : "Unexpected success"
else
  echo "ERROR: curl failed with exit status of $?" >&2
fi

答案 1 :(得分:1)

实现您想要做的事情的另一种方法是先收集返回码,然后执行if语句。

#!/bin/bash
set -eu
status=0
curl -sS --fail http://not-there || status=$?
if ((status)) then
  echo "ERROR: curl failed with exit code of $status" >&2
fi

如果您想在脚本或函数末尾返回错误代码(如果其中任何一个失败),则在检查多个命令失败时,我发现此方法特别方便。

请注意,在上面我使用了算术测试,如果里面的值是非零则返回true(0),否则返回false(非零)。与使用像[[ $status != 0 ]]这样的东西相比,它更短(并且更符合我自己的口味)。