Bash内蔵使用:完了(助けてください!)

Bash内蔵使用:完了(助けてください!)

ページが見つからないようですman complete。したがって、人々がコマンド全体complete --helpのオプションを説明するのに役立つことを願っています。

complete: complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-W wordlist]  [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]
Specify how arguments are to be completed by Readline.

For each NAME, specify how arguments are to be completed.  If no options
are supplied, existing completion specifications are printed in a way that
allows them to be reused as input.

Options:
  -p        print existing completion specifications in a reusable format
  -r        remove a completion specification for each NAME, or, if no
            NAMEs are supplied, all completion specifications
  -D        apply the completions and actions as the default for commands
            without any specific completion defined
  -E        apply the completions and actions to "empty" commands --
            completion attempted on a blank line

When completion is attempted, the actions are applied in the order the
uppercase-letter options are listed above.  The -D option takes
precedence over -E.

bashオプション1でスクリプトコマンドを実行してから(理想的には適切な場合)、有効なファイルおよび/またはディレクトリを使用しようとします。これを使用できますかcomplete?それとも別のアプローチが必要ですか?

今私はこれを持っています:

complete -W "mount unmount" phone

...というスクリプトの場合phone

ベストアンサー1

あなたの要求に従って「フルコマンドのオプション説明ヘルプ」:

すべての詳細を説明するにはストーリーが長くなるので、この記事の最後の部分で役に立つと予想される参考資料のリストを見つけてください。

$1コマンドとファイルで実行される特定のユースケースに関して、次のセクション$2に小さな例を追加しました。

はい

完成関数の作成位置差の処理:

# completion function to differentiate type of completion by argument type
_complete_phone () {
  case ${#COMP_WORDS[@]} in
    1) # 1st position is the `phone` command itself
       return;;
    2) # 2nd position are sub-commands, so we use `-W` for word completion
       words="mount unmount"
       COMPREPLY=($(compgen -W "$words" -- "${COMP_WORDS[COMP_CWORD]}"))
       ;;
    *) # other arguments filter files, either
       # any files using option `-f`
       #COMPREPLY=($(compgen -f -- "${COMP_WORDS[COMP_CWORD]}"))
       # and for specific files (i.e. pattern `*.phone`), use words again
       COMPREPLY=($(compgen -W "$(ls *.phone 2>/dev/null)" -- "${COMP_WORDS[COMP_CWORD]}"))
       ;;
  esac
}

それから関数による完成の有効化パラメータを有効にして-F完成関数名を使用してください。

# complete using your function 
complete -F _complete_phone phone

最後に、次のことを試してください(再現性のために任意のphoneプログラムと「関連」ファイルを作成する必要があります)。

# try
phone () { echo "hello, phone program will $@"; }
touch {my,your}.phone
phone m\tab \tab \tab

文書

バッシュリファレンスマニュアル

情報が必要なときbash

特に bash の完了については、該当する章を参照してください。

源泉:www.gnu.org

バッシュマニュアル

実行しman bashてセクションに移動します。

  • READLINE

    • Readline Variablesset完了関連変数の処理方法について説明します。たとえば、set completion-ignore-case on「大文字と小文字を区別せずにファイル名の一致と完成を実行します」です。
    • Completing基本bash完成。
    • Programmable Completion完了したプロセスとメソッドcompgen、変数など、上記の例で見つかった関連要素を説明してください。COMP_WORDS
  • SHELL BUILTIN COMMANDS

    • compgen完成一致を生成します。
    • complete実行方法を指定します。-W、など-Fのすべてのオプションも説明されています-o
    • compopt追加完了オプションを設定します。

ソース:GNU bash、バージョン5.1.16(1)-リリース(x86_64-pc-linux-gnu)

おすすめ記事