为什么这个 POSIX sh 函数设置 $? = 1

Why does this POSIX sh function set $? = 1

非常简单的脚本,但不知道为什么它会发送退出代码 1...

docker run --rm -it alpine
/ # apk update && apk add curl
...
...
/ # func() { RESPCODE=$(curl -sS -w "%{http_code}" -o /dev/null https://jsonplaceholder.typicode.com/todos/1); EXITCODE=$?; [ $EXITCODE -ne 0 ] && return 2; }
/ # func
/ # echo $?
1

为什么不以零代码退出?!

  • 我们假设 curl 成功。
  • EXITCODE=0
  • 来自 https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.htmlThe exit status of an AND list shall be the exit status of the last command that is executed in the list.
  • [ $EXITCODE -ne 0 ]1 退出状态退出
  • return 2不执行
  • [ $EXITCODE -ne 0 ] && return 2中的最后一个命令是[ $EXITCODE -ne 0 ]
  • [ $EXITCODE -ne 0 ]1 退出状态退出
  • 所以[ $EXITCODE -ne 0 ] && return 2的退出状态是1
  • 函数中的最后一个命令以 1 退出状态退出。
  • 函数以 1 退出状态退出
  • echo $? 输出 1

不要使用 &&|| 作为条件。使用 if.