2014-01-10 43 views
-1

我有这个C程序:

int main() { return 10; } 

运行此之后,当我在终端的打印10echo $?

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

echo $? 

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

为什么?

+1

您如何运行脚本?还请显示您的脚本的内容。 – ouah

+0

我认为他们打印0因为你开始你的bash skript $后?获得另一个值 – Oni1

+1

它就像是一个全新的shell,没有运行命令,是第一个命令,正好是'echo $?' - 因此0 – ShinTakezou

回答

1

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

./c_prog 
echo $? 

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

+3

恐怕它不回答这个问题。 – ouah

2

简单:.sh文件由bash或其他一些shell执行。该二进制文件(/bin/bash或任何位置)执行该脚本,然后退出。如果shell二进制成功退出,它会在您的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 $? 

一个侧面说明:从程序返回随机整数不是最大的想法。退出代码的意思是的东西。这就是为什么C标准的lib定义2宏的:

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

你猜怎么着,EXIT_SUCCESS显示为0,EXIT_FAILURE为1

+0

如果.sh由二进制文件执行,在整个'.sh'程序执行之前如何返回? –

+0

@RikayanBandyopadhyay:添加到我的答案,只需添加'退出$?'或'退出123',如果123是您想要退出的代码 –

+0

@RikayanBandyopadhyay:对不起,误解您的评论:它不能:如果二进制文件是仍然在运行,那么你不能得到它的退出代码,因为它没有执行。脚本_can_获得退出代码,如果二进制文件在该脚本中启动的话,尽管......这就是我添加到我的答案中......但老实说,如果你编写一个C程序,执行类似'system(“/ home /user/bash_script.sh“);',反正使用C有什么意义? –