我正在尝试学习shell脚本,我需要理解其他人的代码。$?变量保存什么?我没法搜索答案,因为他们屏蔽了标点符号。
$?
它是上次执行命令返回的错误代码。0 =成功
先前执行的流程的返回值。
10.4获取程序的返回值 在bash中,程序的返回值存储在一个特殊的变量中 名为$ ?。< / p > 这说明了如何捕获程序的返回值,I 假设dada目录不存在。(这也是 mike建议) #!/bin/bash cd /dada &> /dev/null echo rv: $? cd $(pwd) &> /dev/null echo rv: $?
10.4获取程序的返回值
在bash中,程序的返回值存储在一个特殊的变量中 名为$ ?。< / p > 这说明了如何捕获程序的返回值,I 假设dada目录不存在。(这也是 mike建议)
#!/bin/bash cd /dada &> /dev/null echo rv: $? cd $(pwd) &> /dev/null echo rv: $?
更多细节参见Bash编程手册。
$ ?最后执行命令的结果(退出码)。
这是上次执行的函数/程序/命令的退出状态。请参考:
$?用于查找最后执行命令的返回值。 在shell中尝试以下操作:
ls somefile echo $?
如果somefile存在(不管它是文件还是目录),你将得到ls命令抛出的返回值,它应该是0(默认的"success"返回值)。如果它不存在,你应该得到一个不是0的数字。确切的数字取决于程序。
somefile
ls
0
对于许多程序,您可以在相应的手册页中找到这些数字及其含义。这些通常被描述为“退出状态”,并可能有自己的部分。
运行最后一个命令的退出代码。
如果使用set -e,它非常适合用于调试脚本退出的情况。例如,将echo $?放在导致它退出的命令之后,并查看返回的错误值。
set -e
echo $?
$?是一个命令的退出状态,这样你就可以用菊花链接一系列命令。
例子
command1 && command2 && command3
如果command2的$?产生success (0),则command2将运行;如果command2的$?产生success,则command3将执行
command2
success (0)
success
command3
最小POSIX C退出状态示例
要理解$?,你必须首先理解进程退出状态的概念,这个概念定义为通过POSIX。在Linux中:
当进程调用exit系统调用时,内核会存储传递给系统调用的值(int),即使在进程死亡后也是如此。
exit
int
exit系统调用由exit() ANSI C函数调用,当你从main执行return时间接调用。
exit()
main
return
fork
exec
wait
考虑一下Bash代码:
$ false $ echo $? 1
C "等价物;是:
false.c
#include <stdlib.h> /* exit */ int main(void) { exit(1); }
bash.c
#include <unistd.h> /* execl */ #include <stdlib.h> /* fork */ #include <sys/wait.h> /* wait, WEXITSTATUS */ #include <stdio.h> /* printf */ int main(void) { 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)); }
编译并运行:
g++ -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o bash bash.c g++ -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o false false.c ./bash
输出:
$? = 1
在Bash中,当你按回车键时,fork + exec + wait就会像上面那样发生,然后Bash将$?设置为fork进程的退出状态。
注意:对于像echo这样的内置命令,不需要生成进程,Bash只是将$?设置为0来模拟外部进程。
echo
标准和文档
POSIX 7 2.5.2“特殊参数”;http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_05_02:
? 展开到最新管道的十进制退出状态(请参阅管道)。
特殊参数:
shell对几个参数进行了特殊处理。这些参数只能被引用;不允许分配给他们。[…] ? 展开到最近执行的前台管道的退出状态。
shell对几个参数进行了特殊处理。这些参数只能被引用;不允许分配给他们。[…]
? 展开到最近执行的前台管道的退出状态。
ANSI C和POSIX建议:
0表示程序成功
其他值:程序以某种方式失败。
准确的值可以指示故障的类型。
ANSI C不定义任何值的含义,POSIX指定大于125的值:posix是什么意思?
Bash使用if的退出状态
if
在Bash中,我们经常隐式地使用退出状态$?来控制if语句,如下所示:
if true; then : fi
其中true是一个只返回0的程序。
true
以上等价于:
true result=$? if [ $result = 0 ]; then : fi
和:
if [ 1 = 1 ]; then : fi
[只是一个有着奇怪名字的程序(Bash内置的行为与之类似),而1 = 1 ]是它的参数,另见:Bash中单方括号和双方括号的区别
[
1 = 1 ]