2014-07-13 44 views
7

當在文件上運行DOS2UNIX的我碰到下面的輸出到終端爲什麼dos2unix打印到stderr?

dos2unix: converting file <filename> to UNIX format ... 

在我試圖通過它發送到/ dev/null來抑制輸出我注意到,這是發出的標準錯誤而不是標準輸出正如我所料(因爲它看起來像一個正常的消息,而不是一個錯誤)。是否有一個原因?

+0

你會發現unix充滿了歷史文物,比如爲什麼'dd'需要像'if = ...'這樣的參數,以及爲什麼'tar'需要位置參數而沒有前導'-'。它只是它的方式... –

+3

如果你還沒有找到它,你可以使用'--quiet'標誌來壓制這個輸出 – ebo

+0

因爲它很無聊。但在過去,你可以將輸入輸入到管道中並將管道輸出。需要放置在stderr中的錯誤 –

回答

5

在類Unix環境中是很常見的鏈過程:一個程序的結果被用作另一個程序的輸入。混合結果診斷會混淆下一個處理階段。它還會隱藏來自觀看終端的潛在用戶的診斷信息,其中傳送到下一個程序的處理結果不會顯示。

這是在stdout和stderr中分離結果和診斷的原因。診斷不限於錯誤,而應包含所有不是後續程序預期的處理結果。

關於實際問題:dos2unix通常用於轉換文件,但也可以輸出到stdout(當調用時沒有文件名,它從標準輸入讀取並輸出到標準輸出)。然後stdout可以獨立於stderr重定向。考慮cat blados | dos2unix > blaunix。您仍然會看到診斷程序(可能包含錯誤消息!),但處理結果將轉至blaunix。

在成功的情況下打印診斷程序並不常見—可能對DOS用戶有點適應。如果處理結果包含信息性消息,那將是非常糟糕的;例如,它會破壞一個C文件。

6

沒有理由,但通常stderr不只是錯誤輸出。這是另一個經常用於記錄或信息消息的流。由於日誌消息不是輸出,所以它不會發送到stdout,這是用於程序結果的。

它打印在您的終端上的原因是您的外殼的結果,而不是由應用程序真正控制。

+2

我敢打賭,dos2unix曾經使用'tr -d'\ r'< file > file2'手動完成,在這種情況下stdin和stdout已經很忙。 –

3

很簡單,因爲這是它被實施的方式......

如果你看看the source-code你會看到:

... 
if (!pFlag->Quiet) 
    fprintf(stderr, _("dos2unix: converting file %s to file %s in UNIX format ...\n"), argv[ArgIdx-1], argv[ArgIdx]); 

... 
+1

由於它是[免費軟件](https://en.wikipedia.org/wiki/Free_software),您可以改進源代碼以適合您的需求(但您可能應該發佈您的修補程序...) –

+0

雖然嚴格說問題不在於它是否被實現(這很明顯),而是*爲什麼*。因此,有人可能會認爲,你的答案不是確定國家的答案。但很高興看到它。 –

1

我使用這個單行命令將stderr重定向到標準輸出,跳過得到的第一個不相關的行,並將其餘的重新發送到標準錯誤。

dos2unix thefile 2>&1|tail -n+2 1>&2

0
Try dos2unix -q <filename> 

-q,--quiet 安靜模式。禁止所有警告和消息。返回值爲零。除非使用錯誤的命令行選項。