Fuser

為什麼定影器使用 STDERR?

  • November 6, 2014
SERVER:~ # fuser -uc /var/log
/var/log:             6824(daemon)  9902(root) 14011(root) 14084(root) 14208(lp)
SERVER:~ # fuser -uc /var/log 2>/dev/null
 6824  9902 14011 14084 14208SERVER:~ # 
SERVER:~ # 

**問題:**是因為歷史原因還是有任何技術原因?

fuser實用程序受以下標準的約束:

將診斷資訊輸出到stderr. 這不僅包括錯誤,還包括不是實用程序主要數據輸出的任何內容。

雖然這是有用的數據,但如果它包含在 中stdout,那麼解析輸出將變得越來越困難。

如果stdout被重定向或過濾,stderr 仍然會繼續列印到終端。

根據IEEE Std 1003.1, 2004 Edition,該fuser實用程序:

The *fuser* utility shall write to standard error additional information about the  
named  files indicating how the file is being used.   

標準差

fuser實用程序應將診斷消息寫入標準錯誤。fuser實用程序還應將以下內容寫入標準錯誤:

  • 每個命名文件的路徑名都寫在後面緊跟一個冒號。
  • 對於寫入標準輸出的每個程序 ID,如果程序正在使用文件作為其目前目錄,則字元“c”應寫入標準錯誤,如果程序正在使用該文件,則字元“r”應寫入標準錯誤作為它的根目錄。實現可以寫入其他字母字元來指示文件的其他用途。
  • 當指定**-u**選項時,指示文件使用的字元後面應緊跟使用者名,括號中,對應於程序的真實使用者 ID。如果不能從程序的真實使用者ID 中解析出使用者名,則應寫入程序的真實使用者ID 而不是使用者名。

當標準輸出和標準錯誤指向同一個文件時,輸出應交錯,以便文件名出現在每行的開頭,然後是程序 ID 和指示文件使用的字元。然後,如果指定了**-u**選項,則應寫入使用該文件的每個程序的使用者名或使用者 ID。

A<newline>應在每個文件操作數的上述最後輸出之後寫入標準錯誤。

參考

IEEE Std 1003.1, 2004 版

引用自:https://unix.stackexchange.com/questions/166417