印刷の使用法/ヘルプ(--help)のベストプラクティスと考えられるものは何ですか?


12

UNIXのCLI用のツールを作成する場合、プログラムにヘルプや使用法を出力するにはどうすればよいですか?

私は通常を使用しますがfprintf(stderr, "help text here");、それにはいくつかの問題があります。

  • まず、を使用すべきかどうかはわかりませんstderr。大丈夫ですか、それとも使用すべきstdoutですか?
  • ご想像のとおり、ヘルプテキストは非常に長く、ツールのオプションの数によって異なります。今、私は通常、"strings like that\n"2番目のパラメータにいくつかを入れます。ただし、これにより、ソースコードが50行以上のヘルプテキストで埋められます。簡単に管理できるものではありません。代わりに何をすべきですか?
  • ツールがCまたはCに似た言語で記述されていない場合、可能であればhere-docsを使用する傾向があります(最も顕著なのはPerlです)。私はCでそれを使用できませんが、私が使用できるようなものがありますか?
  • 私はそれを入れて検討していたheaderfile.hの内側には#define HELP "help text here"、私は野生の中でそれを見たことがない、私は実際にそれを使用する必要があるかどうかわかりません。

理想的には、テキストを外部ファイルに入れて含めることができます。#includeただし、そのために使用するのは間違っているようです。どうすればいいですか?

アイデアは、ヘルプテキストを用意して、簡単に管理できるようにすることです。ソースコード内に配置することは、あまり便利ではありません。


1
ソースコードの50行の何がそんなに悪いのですか?最後に置いてください。定期的にそれをいじる必要があるわけではありません。
-whatsisname

2
@whatsisnameの使用法、通常およびlongoptsのヘルプ。最終的に、約200行の文字列がサワーコードに含まれます。それはさておき、私はちょうどなど、ヘルプテキストを入れるのより効率的な方法が存在しなければならないなど、これがベストプラクティスであるとは思わない
ポールモン

回答:


8

ターゲットプラットフォームの内部から自分を刺激する

BSDのソースコードをご覧ください。たとえば、次のとおりです。

  • usage(void)NetBSDの/usr/bin/unameツール[ ソース ]:

    usage(void)
    {
        fprintf(stderr, "usage: uname [-amnprsv]\n");
        exit(EXIT_FAILURE);
    }
    
  • usage(void)NetBSDの/usr/bin/telnet[ ソース ]

  • usage(void)OpenBSDの/bin/ls[ ソース ]

代替案をご覧ください

そして、それらが良いか悪いかを自分で決めてください。Google CodeSearchを使用して、次のような他の人を見つけることができます。

ご覧のとおり、これらと上記のBSDシステム統合ツールとは異なるスタイルです。どちらか一方に従う必要があるという意味ではありません。しかし、通常は周りを見回して、一貫したソリューションに落ち着くのが良いでしょう。

50行のヘルプに対する非標準ソリューション...

50行のテキストを避けたくない場合は、テキストファイルからヘルプを読むことができます(プレーンテキスト、またはman作成した場合はソースを直接解析することもできます)。私はそれをかなりエレガントな方法で見つけます(テキストドキュメントを調べることもできます)が、コアシステムプログラムでは本質的に安全ではなく、障害点が発生します。他の人は、usageor helpメッセージに対しては重いと主張しますが、これらが高速のタイトループで呼び出されるというわけではありません...

疑わしい場合は、巨人に従ってください。


8

stdoutヘルプはエラーではないため、私はを使用します。

これがCでの長い助けであれば、私はhere-docsを模倣しようとします:

printf("This is the help for MyWonderfulApp\n"
       "Options are:\n"
       "    --help: display what you are reading now\n"
       "    --quiet: output nothing\n");

しかし、ほとんどの場合、専用タグmanを使用してページを作成しますnroff -man。アプリ内ヘルプは、単にそのmanページを参照するだけで構成されています。


しかし、ヘルプは必ずしも望ましい標準出力ではありませんか?どうstdlog
greyfade

@greyfade:stdlog標準Cですか?
ムーヴィシエル

@mouviciel:...そうだと思った。そうではないと思います。C ++は、関連する標準ストリーム(持っているcincoutcerr、とclog私は考えて推測するので、)をstdlogCの標準にありました。私の悪い。
greyfade

2

私はあなたのだろうならば、私はただのソースを開いたのだgreptailcatyour_other_favorite_unix_shell_commandそれはそこに行うのかを確認します。私は彼らのやり方がかなりよく考えられていて、多くの人々が維持できると確信しています。

stderrstdout。エラーがある場合は本当に簡単です- stderr情報だけの場合はに書き込みます- stdout。たとえば、間違ったオプションでツールを実行した場合、エラーが表示される可能性があります。たとえばUse --help for usage、これはに属しstderrます。有効なオプション--helpを使用してツールを実行する場合は、を使用してくださいstdout

コードの近くに長いヘルプ文字列を持たないことが望ましい場合は、しないでください。ヘッダーファイルでの#defineはまったく問題ありませんが、実際には個人的な好みです。コマンドラインツールのコードを読む必要がある場合、ユーザーが提供するオプションを処理するファイル内にヘルプ文字列を含めることをお勧めします。


2
それは彼の質問に答えません。
マヴリック

うーん、マイナスイングはどうなっていますか?何のために?
-devmiles.com

@Mavrik:最初の段落はそうです。
ヘイレム

1

私はgnu getoptsライブラリーを使用します。ヘルプ付きの例については、このサンプルプロジェクト、特にparser.yの下部にあるメインメソッドを参照してください。

中括弧で囲まれているため、使用しているvimエディターは行をまとめて折りたたむことができ、必要のないときには気づきさえしません。


1

Cを使用している場合、またはBoostライブラリに依存しない場合は、GNUを使用しますgetopt。それ以外の場合は、ヘルプを自動的に印刷するBoost Program Optionsを使用します。

また、オプションの処理に関しては、適切なオプションを推測することもベストプラクティスの1つです。私はGitからそれを学び、今では私のプロジェクトで同じものを使用しています。基本的に、ユーザーが未知のコマンドラインオプションを入力した場合、Damerau–Levenshtein距離を使用して最適な一致を印刷します。

例として使用できる、これに関する小さな記事を書きました。

それが役に立てば幸い :)


1

明らかに、cout <<またはprintf()コードでホールページを作成するのは面倒です。特に段落を変更して再入力する必要がある場合はなおさらです。したがって、たとえばテキストをより簡単にフォーマットできるemacsなどを使用して、別のファイルでそのテキストを編集することは明らかに良い考えです。

次に、次のsedスクリプトを使用して、そのテキストファイルを有効なCヘッダーファイルに変換できます。

s/\"/\\\"/g
s/$/\\n"/
s/^/"/
1i\
const char *helpStr = 
$a\
;

次に、ヘッダーファイルをソースコードに#include -ing すると、次のようにテキストを書き出すことができます。

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