2014-10-30 20 views
0

注意:這個問題沒有以正確的方式提出。原因在於條件行if ! (commad)中的!部分的的命令,因此,它更改了$?。所以,當我檢查$?退出狀態command時,我錯了。接受的答案詳細解釋了這一點。爲什麼我感到困惑:「BASH命令失敗時退出狀態代碼爲0」

根據我的編碼經驗,程序在成功時返回/退出0,失敗時返回其他值。例如,在C中,我們使用exit 0來表示終止成功。但是當我編寫一個bash腳本來確定命令是否成功時,我發現很奇怪0現在意味着發生了一些錯誤,並且命令失敗。例如,

if ! (make $1); then 
    exit 1 
fi 

問題爲什麼退出狀態代碼爲0,在命令BASH失敗?

+0

你談論的'! (讓$ 1)在這裏測試,或者你在談論別的東西? (至於你對'scp'的評論,我已經用了幾種不同的方式在它失敗的情況下運行它,並且它的退出狀態是1)。 – nos 2014-10-30 22:32:55

+1

簡答:不是。如果使用'!'反轉它,另一方面... – 2014-10-30 22:33:00

+0

'scp nosuchbox.example.com:nosuchfile.txt。 ; echo $?'爲我打印1。 – 2014-10-30 22:34:45

回答

3

在這個問題上提出的主張是錯誤的; bash不使用0表示失敗的退出。

$ make bad; echo $? 
make: *** No rule to make target `bad'. Stop. 
2 
$ scp badhost:/something .; echo $? 
ssh: Could not resolve hostname badhost: nodename nor servname provided, or not known 
1 

當然,用!反轉失敗和成功,將有可能使$?爲0以下故障的影響 - 但是這是明確的和蓄意的行動。

$ ! make bad; echo $? 
make: *** No rule to make target `bad'. Stop. 
0 
$ ! scp badhost:/something .; echo $? 
ssh: Could not resolve hostname badhost: nodename nor servname provided, or not known 
0 
+1

」bash不使用0表示成功退出「 - 它的確如此,而你剛剛證明了這一點。只是關於命令退出狀態的「C邏輯」(0 = false)而言是錯誤的。 – 2014-10-30 22:45:47

+0

@KarolyHorvath除了在算術語境中:'if((0));然後回聲「我愛小馬」; fi':你不會看到我最喜歡的動物是什麼。 – 2014-10-30 22:48:55

+0

@KarolyHorvath,...的確如此。 *捂臉*。 – 2014-10-30 22:50:19

0

邏輯,邏輯運算符||&&,否定和其他一切的短路是在兩種語言相同。

唯一的區別是什麼代表一個事實(真實,成功)和虛假(錯誤,失敗)。

在C 0是錯誤的,其他一切都是真實的。在bash退出狀態上下文中,情況正好相反。

if ! (make $1); then

應該讀作:如果make $1失敗(=它未返回0),然後...

相關問題