为什么这个 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.html:
The 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
.
非常简单的脚本,但不知道为什么它会发送退出代码 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.html:
The 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
.