2011-08-07 89 views
45

diff手冊頁,我發現這些出口值:diff的錯誤退出值是什麼?

0  No differences were found. 
    1  Differences were found. 
    >1  An error occurred. 

是否有不同的錯誤不同的出口值超過1?

回答

48

這取決於您的diff命令。礦(GNU diffutils的3.0)說:

0退出狀態意味着沒有分歧發現,1意味着一些 差異被發現,並2意味着麻煩。通常,不同的 二進制文件算作麻煩,但可以通過使用 -a--text選項或-q--brief選項來更改這一點。

+4

同意,我檢查了源,並且唯一的出口代碼EXIT_SUCCESS,EXIT_FAILURE(stdlib.h中都定義)和EXIT_TROUBLE ,在src/diffutils-3.0/system.h中定義 –

+0

如果存在兩個(大)不同的二進制文件,'--text'選項會使我的STDOUT變得混亂。 –

+0

我也在使用GNU diffutils,但引用了錯誤的手冊頁。 –

6

根據您使用的差異版本,可能有或者可能沒有不同的錯誤代碼。如果我沒有記錯,標準的BSD diff總是返回0,1或2的退出代碼。

但是,聯機幫助頁並未映射差異可能會執行的所有操作,但可以使用diff的文檔命令。在shell腳本中,我想知道文件是否匹配(exit = 0)或不匹配(exit = 1)。但是,在我的shell腳本中,我也想知道diff命令本身不起作用。

diff $file1 file2 > /dev/null 2>&1 
error=$? 
if [ $error -eq 0 ] 
then 
    echo "$file1 and $file2 are the same file" 
elif [ $error -eq 1 ] 
    echo "$file1 and $file2 differ" 
else 
    echo "There was something wrong with the diff command" 
fi 

試想一下,如果有人告訴我,2意味着diff命令失敗,但diff命令的新版本則無法讀取一個文件(退出= 2),而遺漏的文件(出口加以區分= 3)。現在,想象一下,如果我沒有在diff命令的早期版本以下,但$file2根本不存在:

diff $file1 file2 > /dev/null 2>&1 
error=$? 
if [ $error -eq 2 ] 
then 
    echo "There was something wrong with the diff command" 
elif [ $error -eq 1 ] 
    echo "$file1 and $file2 differ" 
else 
    echo "$file1 and $file2 are the same file" 
fi 

在上面的代碼,我檢查的2和1的錯誤代碼,而不是3 。因此,我並沒有檢測到丟失的文件,而是假定文件匹配。

聯機幫助頁正在嘗試確保將來升級到操作系統不會導致大部分shell腳本突然失敗。這就是爲什麼有單獨的awknawk命令和單獨的grepegrep命令。

*根據@chus的評論更新。

+3

小心:在執行'if [$?'後更新$ $?' eq 0]',所以'elif'評估與差異輸出無關。 – chus

+1

「根據您使用的'diff'的版本,[可能或可能]不會有不同的錯誤代碼。」 [POSIX'diff'在文件完全相同時退出,當它們不同時爲1,否則> 1](http://pubs.opengroup.org/onlinepubs/009696799/utilities/diff.html)。所以你不能假設2,但0和1是安全的。 –

+0

@chus你說得對。我會更新我的答案。 –

3

在我的情況DIFF返回127,搜索它,發現它在tldp.org「退出代碼帶有特殊含義的」 illegal_command用$ PATH或錯字可能出現的問題

127「找不到命令」。

我用了一個不正確的路徑來比較。 :)

字體:tldp.org/LDP/abs/html/exitcodes.html