コマンドラインアプリケーションで標準エラーストリームを使用する場合


9

コマンドラインアプリケーションの作成時にエラーを使用する場合のガイドラインはありますか?驚いたことに、ググるときに何も見つかりませんでした。

特に、私が今心配している問題は、ユーザーが不正な引数を使用してプログラムを呼び出すかどうか、stdoutまたはstderrいつ呼び出すかです。ただし、ユーザーが期待するとおりに動作するプログラムを作成するための明確なルールが必要となる唯一のケースではないので、より包括的な答えは非常に高く評価されます。


これらのエラーメッセージが通常の出力と混ざり合っても大丈夫ですか?たとえば、プログラムはデータのフィルターですか?
1

データのフィルターではありません。また、インタラクティブではありません。ユーザーが引数(これはファイルパスです)を指定して呼び出し、プログラムは機能し、それらのファイルを変更し、いくつかのメッセージを出力し、理想的にはエラーメッセージを出力せずに終了します。
UTF-8

回答:


15

はい、stderr間違った引数が使用されたときにメッセージを表示します。そして、それによってアプリケーションも終了する場合は、ゼロ以外の終了ステータスで終了します。

診断メッセージまたはユーザー操作には、標準エラーストリームを使用する必要があります。診断メッセージには、エラーメッセージ、警告、およびユーティリティが正常に動作しているときの出力の一部ではないその他のメッセージが含まれます(「正しく」とは、ファイルが見つからないなど、例外的なことは何もないことを意味します)。

多くのシェル(すべて?)は、プロンプト、ユーザーの入力内容、メニューなどを表示するstderrので、リダイレクトstdoutしても、シェルとのやり取りが意味のある方法で妨げられることはありません。

以下は、このトピックに関するブログ投稿からの抜粋です。

これは、Unixパイプの発明者であるDoug McIllroyからの引用であり、どのstderrようにして生まれたのかを説明しています。「v6」は、1975年にリリースされた元のUnixオペレーティングシステムの特定のバージョンのバージョンを指します。

すべてのプログラムが診断を標準出力に配置しました。これは、出力がファイルにリダイレクトされるときに常に問題を引き起こしていましたが、出力が疑いのないプロセスに送信されると耐えられなくなりました。それにもかかわらず、人々は標準入力標準出力モデルの単純さに違反することを望まず、v6までこの状況を許容していました。その後まもなく、デニス・リッチーは標準誤差ファイルを導入してゴーディアンの結び目を切りました。それだけでは十分ではありませんでした。パイプラインを使用すると、診断は同時に実行されているいくつかのプログラムのいずれかから発生する可能性があります。自己診断には診断が必要です。
-Doug McIllroy、「リサーチUNIXリーダー:プログラマーズマニュアルの注釈付きの抜粋、1971-1986」

「自分を特定する」とは、単に「ねえ!私が話していることです!これは間違っていました:[...]」と言うだけです。

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

これを実行することをお勧めします。stderrそれ以外の場合は、何を読んでいてもそれを読み取ることができるからですstdout(しかしlsとにかくそれを行わないのですか?)。


したがって、アプリケーションの実行中にユーザーに何かを尋ねる場合、質問をstderrに出力する必要がありますか?それは正しく聞こえません。そのためのソースはありますか?これは、質問と応答以外の出力(ユーザーがどこかにパイプしたい出力)があるアプリケーションにのみ適用されますか?
UTF-8

@ UTF-8質問のテキストをプログラムの出力の一部と見なす必要がありますか?ユーザーが入力したものはどうですか?私はそれがあるべきだとは思いません(シェルがそうあるべきだとは思わないのと同じように)。しかし、多分それはアプリケーションに依存しますか?
Kusalananda

1
編集ありがとうございます。その間、標準アプリケーションの動作を確認したところ、標準アプリケーションの動作は、ユーザーの回答を読んだ後の動作と同じように動作します。
UTF-8

@ UTF-8あなたはこのQ&Aが関連していると思うかもしれません:unix.stackexchange.com/q/331611/22222
terdon

5

標準ストリームのPOSIX仕様から:

プログラムの起動時に、標準入力(従来の入力を読み取るため)、標準出力(従来の出力を書き込むため)、および標準エラー(診断出力を書き込むため)の3つのストリームを事前に定義して明示的に開く必要はありません。

つまり、エラー、デバッグ情報、および診断カテゴリに該当するものはすべてに分類されstderrます。

詳細については関連する質問を参照してください:進捗レポート/ログ情報はstderrまたはstdoutに属しますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.