2

スクリプトのコマンド ライン スイッチの簡単な bash 補完を取得するために、/etc/bash_completion (debian sid、bash v4.2-1、bash-completion v1:1.99-3) の _parse_help 関数を調べています。

私のスクリプトは、標準の GNU 形式と思われるヘルプ メッセージを生成します。

MYSCRIPT [OPTIONS]

Usage:
  -h, --help     Show this help message
  -o, --option   Some option

次に、 を介して補完を有効にしcomplete -F _parse_help ./myscriptます。

残念ながら、これは望ましい結果をもたらしません。最初のタブ./myscript <TAB>(キーを 1 回押すことに注意) で、短縮バージョンではなく、--help と --option を含むフォーマットされていないリストが表示されます。さらに悪いことに、いずれかのオプションの完了が失敗します。実際、ダッシュを入力するだけで、_parse_help は出力の生成を完全に停止します。

全体が非常に壊れているように感じ、オンラインでの参照はあまり見つかりません. この機能はおそらく廃止されたと考えられますか? --help 出力の解析に基づくコマンドライン補完の別の標準的な方法はありますか?

4

1 に答える 1

5

bashリファレンスマニュアルによると-F function、変数から単語リストを読み取ることを期待していますCOMPREPLY

はこの必須変数を設定していないように見える_parse_helpため、 の関数としては適していませんcomplete -F。関数の実行から明らかなように、出力は明らかにエコーされます。

$ _parse_help ./myscript 
-h
--help
-o
--option

@gertjanあなたが試みていたことは、-W wordlist代わりにオプションを使用して達成できます。

$ complete -W "$(_parse_help ./myscript)" ./myscript 
$ ./myscript -
--help    --option  -h        -o
$ ./myscript --
--help    --option
$ ./myscript --help

補完は期待どおりに機能し、補完する--h--help、「--」などの複数の引数があった場合、適切なオプションのみをリストします。

関数を使用しようとしている場合COMPREPLY、次の例からわかるように、設定するだけでは十分ではありません。

注: COMPREPLYは bash 配列であり、()設定時に括弧が必要です

$ function _myscript () { 
>     COMPREPLY=($(_parse_help ./myscript))
> }
$ complete -F _myscript ./myscript 
$ ./myscript -
--help    --option  -h        -o
$ ./myscript --
--help    --option  -h        -o
$ ./myscript --help
--help    --option  -h        -o  

ご覧のとおり、オプションが表示されcompleteていても、フィルタリングを実行する必要があります。でこれを達成できますcompgenが、最初に、現在の引数が何に対してフィルターをかけるかを決定する必要があります。この関数は、最後の例のように_get_comp_words_by_ref、変数を設定することでこれを支援できます。$cur

_parse_helpbash 補完用の関数を使用した完全な実装。

$ function _myscript () {
>     _get_comp_words_by_ref cur
>     COMPREPLY=($(compgen -W "$(_parse_help ./myscript)" -- "$cur"))
> }
$ complete -F _myscript ./myscript 
$ ./myscript - 
--help    --option  -h        -o
$ ./myscript --
--help    --option
$ ./myscript --help

nJoy!

于 2012-12-17T07:57:15.870 に答える