
私は次のようにうまく機能するユーティリティを知っています。grep「正常」メッセージをstdoutに出力し、エラーメッセージをstderrに出力します。
$ grep '^foo' file1 file2
file1:foo
grep: file2: No such file or directory
シェルスクリプトを直接作成するときに、どの出力とどのメッセージをstderrに表示するのか、気にする必要があるのかを判断するのが難しいことがよくあります。
ベストプラクティスについて疑問に思います。特定のメッセージをstderrにリダイレクトするのはいつ必要で合理的で、いつそうではありませんか?
もちろん「状況によって異なります」。しかし、これらの決定を下すのに役立つ洞察はありますか?
この主観的な質問を形式に保つために、私は経験と可能であれば、事実に基づく「なぜ」への答えを奨励したいと思います。
答え1
シェルスクリプトを直接作成するときに、どの出力とどのメッセージをstderrに表示するのか、気にする必要があるのかを判断するのが難しいことがよくあります。
沈黙は金です。すべてが正常であれば何も出力されません。
ベストプラクティスについて疑問に思います。特定のメッセージをstderrにリダイレクトするのはいつ必要で合理的で、いつそうではありませんか?
stderrをstdoutから切り離す最も簡単な方法:すべてのスクリプト出力がパイプを介して別のコマンドにリダイレクトされると想像してください。この場合、stdoutの予期しない情報がパイプラインの順序を破る可能性があるため、すべての通知をstderrに保持する必要があります。
時には、次のようにパイプラインにも表示されます。
command1 | while read line ; do command2 ; done | command3
command2
ユーザー出力に何かを渡す必要があります。一時ファイルがない最も簡単な方法はstderrです。
答え2
stderr
私は通常、データ用にスケジュールされたアプリケーションタスクに関連するすべてを作成しますstdout
。
これを使用して入力を読み取り、パイプを介して他のアプリケーションに渡すときに、出力がステータスメッセージでいっぱいになることは望ましくありませんcat
。
他のアプリケーションまたはマイアプリケーションの後処理プロセッサに興味がある可能性があるすべてのアイテムが削除され、stdout
私のアプリケーションに内部的にのみ関連するすべてのアイテムが削除されますstderr
。
答え3
個人的に好むのは、stderr
情報メッセージだけでなくエラーメッセージや例外も送信することですstdout
。 IMOではstderr
すべての例外が適用されるので、これは私のルールです。