什么是"$?" 准确地给我们一个shell脚本?

Khu*_*tel 26 linux bash shell sh

我看到代码写在网上的某个地方,我想知道究竟什么是"$?" 做/给我们.谷歌搜索没有帮助.

这是我看到的代码:

#!/bin/sh

ping -c 2 localhost
if [ $? != 0 ] ; then
    echo "Couldn't ping localhost, weird"
    fi

ping -c 2 veryweirdhostname.noend 
if [ $? != 0 ] ; then
    echo "Surprise, Couldn't ping a very weird hostname.."
    fi

echo "The pid of this process is $$"
Run Code Online (Sandbox Code Playgroud)

取自:http://efod.se/writings/linuxbook/html/shell-scripts.html

Rei*_*ica 36

$? 是一个变量,包含您运行的最后一个命令的返回值.

示例C程序(example.c):

int main() { return 1; }
Run Code Online (Sandbox Code Playgroud)

示例Bash:

gcc -o example example.c
./example
echo $? # prints 1
Run Code Online (Sandbox Code Playgroud)

  • 但仅当该返回值是8位整数时。有关更多详细信息,请参见[Jens的答案](http://stackoverflow.com/a/13823424/418413)和http://stackoverflow.com/a/2726480/418413。 (3认同)

Jen*_*ens 14

大多数答案都缺少一些细节.在shellPOSIX标准中,在特殊参数部分中找到了明确的答案:

$?扩展到最近管道的十进制退出状态(请参阅管道).

不要对管道这个词感到惊讶,因为即使是一个简单的命令,例如在ls语法上是由单个命令组成的管道.但那么,$?多命令管道是什么?它是管道中最后一个命令的退出状态.

那些在后台执行的管道怎么样grep foo bigfile|head -n 10 > result &

wait一旦管道的最后一个命令完成,就可以检索它们的退出状态.后台进程pid可用$!,并$?仅报告后台命令是否已正确启动.

值得一提的另一个细节是退出状态通常在0到255的范围内,128到255表示由于信号而退出的过程.从C程序返回其他值很可能无法准确反映出来$?.


evi*_*tto 8

它是最近执行的命令的返回码.

按惯例,0表示成功退出,非零表示某种错误.