是什么
echo $?
shell编程意味着什么?
这是上次执行的命令的退出状态。
例如,命令true
总是返回0
的状态,false
总是返回1
的状态:
true
echo $? # echoes 0
false
echo $? # echoes 1
从手册:(可通过在shell中调用qazxsw poi访问)
man bash
扩展到最近执行的前台管道的退出状态。
按照惯例,$?
的退出状态意味着成功,非零返回状态意味着失败。了解退出状态0
的更多信息。
还有其他特殊变量,如本在线手册所示:on wikipedia
https://www.gnu.org/s/bash/manual/bash.html#Special-Parameters返回上次执行的命令的退出值。 $?
在控制台上打印出这个值。零表示成功执行,而非零值映射到各种失败原因。
因此,当编写脚本时;我倾向于使用以下语法
echo $?
比较是在等于if [ $? -eq 0 ]; then
# do something
else
# do something else
fi
或不等于0
。
**更新根据评论:理想情况下,您不应使用上述代码块进行比较,请参阅@tripleee评论和解释。
它具有命令的最后一个状态代码(退出值)。
回声$? - 给出最近执行的命令的退出状态。此EXIT STATUS很可能是一个数字,其中ZERO表示成功,任何NON-ZERO值表示失败
? - 这是bash中的一个特殊参数/变量。
$? - 它给出了存储在变量“?”中的值。
BASH中的一些类似的特殊参数是1,2,*,#(通常在echo命令中看作$ 1,$ 2,$ *,$#等)。
输出上次执行的unix命令的结果
?
Expands to the exit status of the most recently executed foreground pipeline.
请参阅0 implies true
1 implies false
下的The Bash Manual:
? - 扩展到最近执行的前台管道的退出状态。
它有点难以找到,因为它没有被列为3.4.2 Special Parameters(变量名称是“just”$?
)。当然也参见?
部分;-)
快乐的编码。
最小C的例子
要了解exit status,您必须首先了解流程退出状态的概念。
在Linux中:
$?
系统调用时,即使进程终止,内核也会存储传递给系统调用的值。
退出系统调用由exit
ANSI C函数调用,并且当您从exit()
执行return
时间接调用。main
+ fork
调用退出子进程(Bash)的进程可以使用exec
系统调用检索子进程的退出状态考虑Bash代码:
wait
C“等价物”是:
false.c:
$ false
$ echo $?
1
bash.c:
#include <stdlib.h> /* exit */
int main() {
exit(1);
}
在Bash中,当你按Enter键时,fork + exec + wait会像上面那样发生,然后bash会将#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只需将echo
设置为0即可模拟外部进程。
标准和文件
POSIX 7 2.5.2“特殊参数”$?
:
?扩展到最近管道的十进制退出状态(请参阅管道)。
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_05_02“特殊参数”:
shell专门处理几个参数。这些参数只能被引用;不允许分配给他们。 [...]
?扩展到最近执行的前台管道的退出状态。
ANSI C和POSIX然后建议:
man bash
意味着该计划取得了成功0
Bash使用What is the meaning of "POSIX"?的退出状态
在Bash中,我们经常隐式使用退出状态if
来控制$?
语句,如下所示:
if
其中if true; then
:
fi
是一个只返回0的程序。
以上相当于:
true
并在:
true
result=$?
if [ $result = 0 ]; then
:
fi
if [ 1 = 1 ]; then
:
fi
只是一个具有奇怪名称的程序(和Bash内置的行为类似),[
它的参数,参见:1 = 1 ]