私は次のようにうまく機能するユーティリティを知っています。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です。