Command-Line

何時在命令行應用程序中使用標準錯誤流?

  • May 2, 2019

編寫命令行應用程序時是否有使用錯誤的指南?令我驚訝的是,我在Google搜尋時沒有找到任何東西。

特別是,我現在關心的問題是是否使用stdoutstderr使用者何時使用非法參數呼叫程序。但是,非常感謝更全面的答案,因為這肯定不是唯一需要明確規則來編寫以使用者期望的方式執行的程序的情況。

是的,請在stderr使用錯誤參數時顯示消息。如果這也導致應用程序退出,則以非零退出狀態退出。

您應該將標準錯誤流用於診斷消息或使用者互動。診斷消息包括錯誤消息、警告和其他在實用程序正常執行時不屬於實用程序輸出的消息(“正確”意味著沒有發生任何異常情況,例如找不到文件或其他任何情況)。

許多 shell(全部?)顯示提示、使用者鍵入的內容和菜單等,stderr因此重定向stdout不會阻止您以有意義的方式與 shell 互動。

以下內容來自關於此主題的部落格文章:

這是 Unix 管道的發明者 Doug McIllroy 的一句話,解釋了它stderr是如何產生的。“v6”指的是 1975 年發布的原始 Unix 作業系統的特定版本。

> > 所有程序都將診斷資訊放在標準輸出上。當輸出被重定向到一個文件時,這總是會造成麻煩,但當輸出被發送到一個毫無戒心的程序時就變得無法容忍了。儘管如此,人們不願意違反標準輸入標準輸出模型的簡單性,通過 v6.0 容忍了這種情況。此後不久,丹尼斯·里奇通過引入標準錯誤文件打破了難解的結。這還不夠。使用管道,診斷可以來自同時執行的多個程序中的任何一個。需要進行診斷以辨識自己。 >
> ——Doug McIllroy,“研究 UNIX 閱讀器:程序員手冊註釋摘錄,1971-1986” > > >

“確定自己”意味著簡單地說“嘿!這是我在說話!這是錯誤的:

$$ … $$“:

$ ls nothere
ls: nothere: No such file or directory

這樣做stderr更可取,因為否則它可以被正在閱讀的任何東西讀取stdout(但我們不會這樣做,對ls?)。

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