回声$?表现不同

时间:2014-01-10 14:54:15

标签: c shell sh

我有这个C程序:

int main() { return 10; }

在终端中编写echo $?后运行此操作后,它会打印10

现在假设我有一个.sh文件:

echo $?

运行C程序后,如果我运行.sh文件,则会打印0

为什么?

2 个答案:

答案 0 :(得分:2)

简单:.sh文件由bash或其他shell执行。该二进制文件(/bin/bash或其中的任何位置)执行脚本然后退出。如果shell二进制文件成功退出,它会将 0 返回给系统
在bin将10返回到系统后,执行.sh文件后,将启动一个新的shell进程(此shell不会执行您的程序)。所以echo $?可能回应执行shell实例运行的另一个进程的返回值(登录,或者其他......)

命令echo $?回显您执行的最后一个程序返回的退出代码的值。如果你的C程序,它返回10,所以你看到10出现。您的.sh文件虽然由另一个二进制文件执行,但返回0(成功时),因此echo $?显示为0.

假设你这样做:

./your_bin
./your.sh
echo $? 
 //--> echoes 0
./your_bin
echo $?
  //--> echoes 

如果你在bash脚本中执行二进制文件,以及你的脚本“转发”那个二进制文件的退出代码,那么简单地写一下:

#!/bin/bash
./your_bin
exit $?

附注:从程序中返回随机的int不是最好的想法。退出代码意味着什么。这就是C标准lib定义2个宏的原因:

printf("%d vs %d\n",
    EXIT_SUCCESS
    EXIT_FAILURE
);

猜猜是什么,EXIT_SUCCESS显示为0,EXIT_FAILURE为1。

答案 1 :(得分:1)

如果你想获得你的c程序的退出值,你也可以在.sh文件中启动你的c程序,然后创建echo $?

./c_prog
echo $?

$的价值?是最后一个命令的退出值。如果启动仅包含echo $?的bash脚本,则它们没有最后一个命令。