52

アプリケーションの「使用法」を印刷する場合、stdoutまたはstderrのどちらで実行する必要がありますか?

アプリケーションにもよりますが、いくつかのケースを見てきましたが、1つのルールはないようです。たぶん私は間違っていて、1つの良い習慣があります。その場合、それは何ですか?

4

8 に答える 8

53

考えたことはありませんが、プログラムが引数なしまたは間違った引数で呼び出された場合はstderrに使用法の説明を書き、--help(または同様の)引数で呼び出された場合はstdoutに書きませんか?このように、エラーが原因で使用状況が表示された場合はstderrに移動し、ユーザーが要求したためにエラーでない場合はstdoutに移動します。どういうわけか、論理的なようです。

于 2010-02-04T12:44:04.820 に答える
8

明示的に要求された「usage」(-h、-?、または--helpオプションを使用)はstdoutに移動し、誤った構文またはその他のエラーに応答して出力される「usage」はstderrに移動することに同意します。

ただし、ますます人気が高まっているpoptライブラリ(コマンドライン解析を処理します。その名前は「解析オプション」を表します)には、自動生成されたヘルプの機能が含まれており、常にそれをstderrに送信することに注意してください。poptのmanページを引用します。

--usageまたは--helpがpoptの自動ヘルプを使用するプログラムに渡されると、poptはオプションが見つかるとすぐにstderrに適切なメッセージを表示し、戻りコード0でプログラムを終了します。

これはポップバグだと思いますが、問題は、POSIX(またはそれが延期するISO C)が「診断出力」の意味を定義しなかったことです。'manstderr'またはPOSIX.1-2008を読んでください。

于 2012-01-10T21:23:27.817 に答える
4

これは意見に過ぎませんが、stderrに書き込むのが最善の方法だと思います。これにより、通常の出力がリダイレクトされた場合でも、ユーザーがミスをした場合に使用法メッセージが表示されます。

于 2010-02-04T12:36:25.897 に答える
3

STDERRを使用するのは、STDOUTに配置するだけでパイプ出力で問題が発生する可能性があり、cronジョブのログに表示されるため、間違いに気づきやすくなるためです。

于 2010-02-04T12:37:43.093 に答える
3

画面に収まらないオプションがたくさんあるプログラムにいつも悩まされていますが、として実行すると、ヘルプが実際にstderrprogram --help | lessに送信されたため、何も表示されません。

--help明示的に要求された使用法(つまりオプション)が出力をstdoutに送信するというアイデアが好きです。無効なオプションの場合、詳細な使用情報を表示する必要はないと思います。stderrInvalid option "--some-option". Run "program --help" for usage information.に送信されるようなエラーメッセージが必ず表示されます。プログラムがデフォルトで無効なオプションで使用法情報を出力することを決定した場合、またはオプションなしで呼び出された場合、無効な使用法について不平を言う短いエラーメッセージがあるはずですが、ヘルプ自体はstdoutに行く可能性があります。

于 2016-04-19T01:24:38.617 に答える
3

次にstdoutの場合--help、それ以外の場合はstderr。Javaユーザー向けのJCommanderコードは次のとおりです。

MyOptions myOptions = new MyOptions();
JCommander jCommander = new JCommander(myOptions);

try {
    jCommander.parse(args);
} catch (ParameterException exp) {
    /* print the exp here if you want */
    StringBuilder sb = new StringBuilder();
    jCommander.usage(sb);
    System.err.println(sb.toString());
    System.exit(1);
}

if(myOptions.isHelp()) {
    jCommander.usage();
    System.exit(0);
}
于 2016-06-17T19:02:59.810 に答える
2

私によると、基準は出現が情報であるかどうかです。すぐに反応したり注意を払ったりする必要がある場合は、stderrに入れます(バッファリングされていないため)。それが何らかの形で有益であり、エラーを考慮しない場合、それはstdout用です。

于 2010-02-04T12:37:10.400 に答える
2

コマンドラインの「使用法」をstdoutまたはstderrに印刷する必要がありますか?

組織のコーディング基準によると思います。組織の外では、おそらく、これは、最高のオペレーティングシステム、最高のエディター、適切な宗教など、際限なく議論されているトピックの1つです...

Javaコード規約( SEPT 1997)を参照すると、Javaはそれを指定しません。答えはありません、そしてそれは際限なく議論されるでしょう。

GNUのコーディング標準によれば、標準出力に出力する必要があります。

4.7.2 --help

標準の--helpオプションは、プログラムを呼び出す方法の簡単なドキュメントを標準の出力で出力し、正常に終了する必要があります。これが確認されたら、他のオプションと引数は無視する必要があり、プログラムは通常の機能を実行しないはずです。

'--help'オプションの出力の終わり近くに、バグレポートの電子メールアドレス、パッケージのホームページ(通常は'<a href="http://www.gnu.org/software/pkg")を示す行を配置してください。 rel = "nofollow noreferrer"> http://www.gnu.org/software/pkg'、およびGNUプログラムの使用に関するヘルプの一般的なページ。形式は次のようになります。

Report bugs to: mailing-address
pkg home page: <http://www.gnu.org/software/pkg/>
General help using GNU software: <http://www.gnu.org/gethelp/>

他の適切なメーリングリストやウェブページに言及してもかまいません。


これが「バージョン」の関連トピックです。これもGNUコーディングガイドからのものであり、標準出力にも書き込みます。

4.7.1 --version

標準の--versionオプションは、名前、バージョン、オリジン、およびリーガルステータスに関する情報をすべて標準出力に出力し、正常に終了するようにプログラムに指示する必要があります。これが確認されたら、他のオプションと引数は無視する必要があり、プログラムは通常の機能を実行しないはずです。

最初の行は、プログラムが簡単に解析できるようになっています。適切なバージョン番号は、最後のスペースの後に始まります。さらに、このプログラムの正規名が次の形式で含まれています。

GNU Emacs 19.30

プログラムの名前は定数文字列である必要があります。argv[0]から計算しないでください。アイデアは、ファイル名ではなく、プログラムの標準名または正規名を記述することです。コマンドがPATHで見つかった正確なファイル名を見つける方法は他にもあります。

プログラムがより大きなパッケージの補助的な部分である場合は、次のようにパッケージ名を括弧で囲んでください。

emacsserver (GNU Emacs) 19.30

パッケージのバージョン番号がこのプログラムのバージョン番号と異なる場合は、閉じ括弧の直前にパッケージのバージョン番号を記載できます。

このプログラムを含むパッケージとは別に配布されているライブラリのバージョン番号を記載する必要がある場合は、記載するライブラリごとにバージョン情報の追加行を印刷することでそれを行うことができます。これらの行には、最初の行と同じ形式を使用してください。

プログラムが「完全を期すために」使用するすべてのライブラリについては言及しないでください。これにより、多くの役に立たない混乱が生じます。ライブラリのバージョン番号は、実際にデバッグで非常に重要であることがわかった場合にのみ言及してください。

バージョン番号の行の後の次の行は、著作権表示である必要があります。複数の著作権表示が必要な場合は、それぞれを別々の行に配置してください。

次に、ライセンスを示す行をたどる必要があります。できれば以下の略語の1つを使用し、プログラムはフリーソフトウェアであり、ユーザーは自由にコピーおよび変更できることを簡単に説明します。また、法律で許可されている範囲での保証はありません。以下の推奨される表現を参照してください。

クレジットを与える方法として、プログラムの主要な作者のリストで出力を終了することは問題ありません。

これらのルールに従う出力の例を次に示します。

GNU hello 2.3
Copyright (C) 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

..。

于 2017-06-21T22:01:47.670 に答える