質問: 'command' ]] then compreply=( $(compgen -w "${opts}" -- ${cur}) ); return 0; fi } complete -f _command_opt -o bashdefault -o default 'command' ただし、command f[tab][tab]と入力すると、foo:barとfoo:fooが一覧表示されますが、どちらもコマンドラインで完了しません(まだ区別されていないためです。これにより、command foo:が生成され、カーソルが(スペースを追加するのではなく)現在のwordの終わりで、bまたはfと入力し、もう一度tabキーを押してコマンドを終了します。問題の例は、意味を表示することだけです。 ...実際の場合、prefix:suffixの組み合わせは非常に長いため、部分的な完了は非常に有益です。たとえば、すべてがprefix translationupdateprocess:で始まる25の異なるコマンドであり、translationupdateprocessは、その数のオプションを持つ25の異なる同じ長さのプレフィックスの1つです。このように操作するためにbashを完成させる方法を知っている人はいますか?
回答: 次のコードを使用できます(明確にするために、オプションをfoo:baz foo:qux bar:eat bar:eggに置き換えました)。function _command_opt() { local cur cursec command opts compreply=() cur="${comp_words[comp_cword]}" cursec=`echo ${cur} | awk -f ':' '{print $1}'`; command="${comp_words[1]}" opts="foo bar" case "${command}" in foo) compreply=( $(compgen -w "baz qux" -- ${cursec}) ); return 0;; bar) compreply=( $(compgen -w "eat egg" -- ${cursec}) ); return 0;; *) ;; esac compreply=( $(compgen -w "${opts}" -s ":" -- ${cur}) ); compopt -o nospace; } complete -f _command_opt -o bashdefault -o default 'command' commandと入力するとtab 最初のレベルのリストfoo: bar:を取得でき、fと入力するとtabtab 第2レベルbaz quxの完了リストを取得します。次に、qと入力できますtab 完全なコマンドラインを取得するにはcommand foo:qux。それが役に立てば幸い。