コマンドラインアプリケーションの作成時にエラーを使用する場合のガイドラインはありますか?驚いたことに、ググるときに何も見つかりませんでした。
特に、私が今心配している問題は、ユーザーが不正な引数を使用してプログラムを呼び出すかどうか、stdout
またはstderr
いつ呼び出すかです。ただし、ユーザーが期待するとおりに動作するプログラムを作成するための明確なルールが必要となる唯一のケースではないので、より包括的な答えは非常に高く評価されます。
コマンドラインアプリケーションの作成時にエラーを使用する場合のガイドラインはありますか?驚いたことに、ググるときに何も見つかりませんでした。
特に、私が今心配している問題は、ユーザーが不正な引数を使用してプログラムを呼び出すかどうか、stdout
またはstderr
いつ呼び出すかです。ただし、ユーザーが期待するとおりに動作するプログラムを作成するための明確なルールが必要となる唯一のケースではないので、より包括的な答えは非常に高く評価されます。
回答:
はい、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
とにかくそれを行わないのですか?)。
標準ストリームのPOSIX仕様から:
プログラムの起動時に、標準入力(従来の入力を読み取るため)、標準出力(従来の出力を書き込むため)、および標準エラー(診断出力を書き込むため)の3つのストリームを事前に定義して明示的に開く必要はありません。
つまり、エラー、デバッグ情報、および診断カテゴリに該当するものはすべてに分類されstderr
ます。
詳細については関連する質問を参照してください:進捗レポート/ログ情報はstderrまたはstdoutに属しますか?