2013-09-27 53 views
1

我在看這段代碼:這看起來很愚蠢,但/ dev/null是否有返回值?

if diff file1 file2 > /dev/null;     
then echo "same files!" ` 
else ..... 

除非它的輸出定向到/ dev/null的不DIFF評估假的?

+4

'diff file1 file2>/dev/null'的值是'diff'的返回值。你爲什麼期望'diff'的返回值根據你重定向輸出的位置而不同? – lurker

+0

我不確定。問題是diff file1 file2應該只是返回0,如果文件是相同的權利?所以我不明白他們爲什麼將輸出重定向到dev/null – hahahaha

+0

這段代碼只關心文件是否相同。 'diff'輸出所有的差異。如果你不想看到差異,但只是想知道有什麼不同,你可以將輸出發送到'/ dev/null'。這就是你發送你不關心的輸出的地方。返回值是分開的,而不是「diff」的「輸出」。 – lurker

回答

4

來說明差異的最簡單的方法是例如:

$ if diff file1 file2 
> then echo The same 
> else echo Different 
> fi 
2c2 
< bb 
--- 
> ee 
Different 
$ if diff file1 file2 > /dev/null 
> then echo The same 
> else echo Different 
> fi 
Different 
$ diff -u file1 file2 
--- file1 2013-09-26 19:44:06.000000000 -0700 
+++ file2 2013-09-26 19:44:19.000000000 -0700 
@@ -1,4 +1,4 @@ 
aa 
-bb 
+ee 
cc 
dd 
$ 

沒有輸出發送給/dev/null,你看這兩個diff標準輸出和測試的diff退出狀態相應的操作。當您將diff的輸出發送到/dev/null時,您根本沒有看到diff輸出,但您仍然通過測試diff的退出狀態獲得適當的操作。如果你正在編寫腳本,你通常不希望用戶看到實際的差異;知道這些文件是不同的就足夠了。

還有其他工具可用於該工作;特別是,cmp -s file1 file2只返回退出狀態,指示文件是相同還是不同(並且可以在二進制文件上使用,而不僅僅是文本文件)。您不需要使用cmp進行I/O重定向。但是,使用diff並隱瞞差異是合法的。

+0

還要感謝,你是如何格式化代碼的? – hahahaha

+0

多年的練習:)在編輯框中,按照您希望的方式輸入代碼(或者,更好的方法是在編輯器中準備好,然後複製並粘貼到編輯框中)。避免在輸入中使用任何選項卡;他們搞亂了佈局。然後選擇要作爲代碼的材料並按**上面的{}'**按鈕;將選定的材質縮進4個空格,然後MarkDown語言將其視爲'代碼'並將其格式化爲帶有灰色背景的固定寬度字體。您也可以使用編輯框上方的幫助。或者,您可以在每行的開頭輸入四個空格的代碼。 –

+0

說'diff -q file1 file2'不需要重定向到'/ dev/null'。 – devnull

3

不,shell正在測試返回值爲diff,而不是寫入標準輸出的內容。返回值是不同的。它們是程序退出時返回的狀態代碼。所以,你指導輸出的地方並不重要(如果有的話)。並且沒有/dev/null沒有返回值。這不是一個你運行的程序 - 它只是發送你不想存儲的數據的地方。

+0

難道你不會把這個「某處」稱爲一個*設備*嗎? – ErikE

+0

這是我親自調用'/ dev/null'的最後一件事情之一。 – jedwards

+0

@ErikeE是的,我會在技術上,但我喜歡把它想成一個黑洞。更多的特殊文件忽略寫入到它的任何數據。 – paddy

1

/dev/null沒有返回值,因爲它不是執行的二進制文件。當你不關心輸出時,它只是一個重定向數據的地方。