Fuser
為什麼定影器使用 STDERR?
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>
應在每個文件操作數的上述最後輸出之後寫入標準錯誤。參考