2014-01-10 42 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有什麼意義? –