【问题标题】:What does "$?" give us exactly in a shell script? [duplicate]"$?" 是什么意思?给我们一个shell脚本吗? [复制]
【发布时间】:2011-11-15 00:54:02
【问题描述】:

我在网上某处看到写的代码,我想知道“$?”到底是什么?做/给我们。 谷歌搜索没有帮助。

这是我在其中看到的代码:

#!/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 $$"

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

【问题讨论】:

  • stackoverflow.com/questions/90418/… 给出最后执行命令的退出状态
  • $?是最后一条命令的返回码
  • 和往常一样,cmd; if [ $? != 0 ]; then stuff; fi 的使用是一种反模式,它更优雅地写成if ! cmd ; then stuff; fi(前提是您不需要stuff 中的$? 的值,其中案例if cmd; then : nothing; else stuff with $?; fi) 甚至cmd || stuff

标签: linux bash shell sh


【解决方案1】:

$? 是一个变量,保存您运行的最后一个命令的返回值。

示例 C 程序 (example.c):

int main() { return 1; }

示例 Bash:

gcc -o example example.c
./example
echo $? # prints 1

【讨论】:

【解决方案2】:

大多数答案都缺少一些细节。确定的答案在POSIX standard for the shell, in the section on special parameters

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

不要对管道这个词感到惊讶,因为即使是像ls 这样的简单命令在语法上也是由单个命令组成的管道。但是,对于多命令管道,$? 是什么?这是管道中 last 命令的退出状态。

那么在后台执行的管道呢,比如grep foo bigfile|head -n 10 > result &

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

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

【讨论】:

  • +1 这是一个很好的综合答案。我唯一要说的是,在最后一句中,当 C 程序返回 0-255 以外的值时会发生什么非常清楚:$? 将是返回值的隐式整数转换的低 8 位。虽然很少有程序会傻到以 double 或 char 退出,但有几个程序在返回负值时依赖于这种模 256 行为。
  • (另一方面,在 POSIX shell 中调用 exit 命令时,给它一个 0-255 is undefined 以外的参数。)
  • @kojiro 什么是隐式转换?强制转换在 C 中始终是显式的。您的意思是算术转换 还是屏蔽
  • 是的,我滥用了cast这个词。我的意思是隐式转换
【解决方案3】:

这是最近执行的命令的返回码。

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

【讨论】:

    【解决方案4】:

    此特殊变量显示在脚本或命令行中运行的最后一个命令的退出状态。例如,在命令行中,用户可以键入

     who; echo $?
    

    然后输出将是

     user  tty7         2014-07-13 19:47
     0
    

    这显示了 who 的输出和命令的退出状态。脚本也是一样的。

     #!/bin/bash
     who
     echo $?
    

    输出:0

    【讨论】:

      【解决方案5】:

      其他答案很好地涵盖了 bash,但您没有在问题中指定 shell。在 csh(和 tcsh)中,$? 可用于query the existence of variables,例如

      if $?my_var then
          echo my_var exists
      endif
      

      【讨论】:

        猜你喜欢
        • 2010-12-25
        • 2017-04-17
        • 2018-05-11
        • 1970-01-01
        • 2013-04-08
        • 2012-04-19
        • 2012-04-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多