我正在尝试学习shell脚本,我需要理解其他人的代码。$是什么?变量?我没法搜索答案,因为他们屏蔽了标点符号。
当前回答
$ ?用于查找最后一次执行命令的返回值。 在shell中尝试以下操作:
ls somefile
echo $?
如果somefile存在(不管它是文件还是目录),你将得到ls命令抛出的返回值,它应该是0(默认的"success"返回值)。如果它不存在,你应该得到一个不是0的数字。确切的数字取决于程序。
对于许多程序,您可以在相应的手册页中找到这些数字及其含义。这些通常被描述为“退出状态”,并可能有自己的部分。
其他回答
运行最后一个命令的退出代码。
$ ?最后执行命令的结果(退出码)。
这是上次执行的函数/程序/命令的退出状态。请参考:
退出/退出状态@ tldp.org 特殊Shell变量@ tldp.org 特殊字符@ tlpd.org
$ ?用于查找最后一次执行命令的返回值。 在shell中尝试以下操作:
ls somefile
echo $?
如果somefile存在(不管它是文件还是目录),你将得到ls命令抛出的返回值,它应该是0(默认的"success"返回值)。如果它不存在,你应该得到一个不是0的数字。确切的数字取决于程序。
对于许多程序,您可以在相应的手册页中找到这些数字及其含义。这些通常被描述为“退出状态”,并可能有自己的部分。
最小POSIX C退出状态示例
要理解$?,您必须首先理解由POSIX定义的进程退出状态的概念。在Linux中:
当进程调用exit系统调用时,内核存储传递给系统调用的值(int),即使在进程死亡后也是如此。 exit系统调用由exit() ANSI C函数调用,并且在从main返回时间接调用。 调用退出子进程的进程(Bash),通常使用fork + exec,可以通过等待系统调用检索子进程的退出状态
考虑一下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中,当你按enter键时,fork + exec + wait就像上面那样发生,然后Bash设置$?到fork进程的退出状态。
注意:对于像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的值:“POSIX”的含义是什么?
Bash使用if的退出状态
在Bash中,我们经常使用退出状态$?隐式控制if语句,如下所示:
if true; then
:
fi
true是一个只返回0的程序。
以上等价于:
true
result=$?
if [ $result = 0 ]; then
:
fi
和:
if [ 1 = 1 ]; then
:
fi
[只是一个有着奇怪名字的程序(Bash内置的行为与之类似),1 = 1]它的参数,请参见:Bash中单方括号和双方括号的区别
推荐文章
- 如何从查找“类型d”中排除此/ current / dot文件夹
- 只使用md5sum获取哈希值(没有文件名)
- 使用sh shell比较字符串
- 在Bash中测试非零长度字符串:[-n "$var"]或["$var"]
- 如何创建Bash别名?
- 如何设置ssh超时时间?
- 将所有变量从一个shell脚本传递到另一个?
- 只列出UNIX中的目录
- 如何删除shell脚本中文件名的扩展名?
- 'find -exec'是Linux中的shell函数
- 临时更改bash中的当前工作目录以运行命令
- 重定向复制的标准输出到日志文件从bash脚本本身
- Shell脚本for循环语法
- Docker入口点运行bash脚本被“拒绝权限”
- Chmod递归