什么是
echo $?
在bash编程中意味着什么?
答案 0 :(得分:151)
这是上次执行的命令的退出状态。
例如,命令true
始终返回0
状态,false
始终返回1
状态:
true
echo $? # echoes 0
false
echo $? # echoes 1
从手册中:(通过调用shell中的man bash
访问)
$?
扩展到最近执行的前台管道的退出状态。
按惯例,退出状态0
表示成功,非零退货状态表示失败。详细了解退出状态 on wikipedia。
您还可以在此在线手册中看到此类其他特殊变量:https://www.gnu.org/s/bash/manual/bash.html#Special-Parameters
答案 1 :(得分:13)
$?
返回上次执行的命令的退出值。 echo $?
在控制台上打印该值。零表示成功执行,而非零值映射到各种失败原因。
因此在编写脚本时;我倾向于使用以下语法
if [ $? -eq 0 ]; then
# do something
else
# do something else
fi
比较是等于0
或不等于0
。
答案 2 :(得分:6)
它具有命令的最后一个状态代码(退出值)。
答案 3 :(得分:5)
echo $? - 提供最近执行的命令的退出状态。此退出状态很可能是一个ZERO暗示成功的数字,以及任何指示 失败
的非零值? - 这是bash中的一个特殊参数/变量。
$? - 它提供存储在变量“?”中的值。
BASH中的一些类似特殊参数是1,2,*,#(通常在echo命令中看作$ 1,$ 2,$ *,$#等)。
答案 4 :(得分:2)
来自http://www.gnu.org/s/bash/manual/bash.html#Special-Parameters
?
Expands to the exit status of the most recently executed foreground pipeline.
答案 5 :(得分:2)
最小POSIX C退出状态示例
要了解$?
,必须首先了解流程退出状态的概念。
在Linux中:
当进程调用exit
系统调用时,即使进程死亡,内核也会存储传递给系统调用的值。
退出系统调用由exit()
ANSI C函数调用,而当您从return
执行main
时间接调用。
通常使用fork
+ exec
调用退出子进程(Bash)的进程可以通过wait
系统调用检索子进程的退出状态< / p>
考虑Bash代码:
$ false
$ echo $?
1
C的“等效”是:
false.c:
#include <stdlib.h> /* exit */
int main() {
exit(1);
}
bash.c:
#include <unistd.h> /* execl */
#include <stdlib.h> /* fork */
#include <sys/wait.h> /* wait, WEXITSTATUS */
#include <stdio.h> /* printf */
int main() {
if (fork() == 0) {
/* Call false. */
execl("./false", "./false", (char *)NULL);
}
int status;
/* Wait for a child to finish. */
wait(&status);
/* Status encodes multiple fields,
* we need WEXITSTATUS to get the exit status:
* http://stackoverflow.com/questions/3659616/returning-exit-code-from-child
**/
printf("$? = %d\n", WEXITSTATUS(status));
}
在Bash中,当您按Enter键时,将发生如上的fork + exec + wait,然后bash将$?
设置为分叉进程的退出状态。
注意:对于echo
之类的内置命令,不需要生成进程,而Bash只需将$?
设置为0即可模拟外部进程。
标准和文档
POSIX 7 2.5.2“特殊参数” http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_05_02:
?扩展到最新管道的十进制退出状态(请参阅管道)。
man bash
“特殊参数”:
shell专门处理几个参数。这些参数只能被引用;不允许分配给他们。 [...]
?扩展到最近执行的前台管道的退出状态。
然后,ANSI C和POSIX建议:
0
表示程序成功
其他值:程序以某种方式失败。
确切的值可以指示故障的类型。
ANSI C没有定义任何变量的含义,并且POSIX指定的值大于125:What is the meaning of "POSIX"?
Bash使用if
的退出状态
在Bash中,我们经常隐式使用退出状态$?
来控制if
语句,如下所示:
if true; then
:
fi
其中true
是一个仅返回0的程序。
以上等同于:
true
result=$?
if [ $result = 0 ]; then
:
fi
并在:
if [ 1 = 1 ]; then
:
fi
[
只是一个名称很奇怪的程序(其行为类似于Bash内置的Bash),其参数为1 = 1 ]
,另请参见:Difference between single and double square brackets in Bash
答案 6 :(得分:1)
请参阅The Bash Manual下的3.4.2 Special Parameters:
? - 扩展到最近执行的前台管道的退出状态。
有点难以找到,因为它未列为$?
(变量名称为“just”?
)。当然,请参阅exit status部分; - )
快乐的编码。
答案 7 :(得分:1)
输出上次执行的unix命令的结果
0 implies true
1 implies false