Bash オートコンプリートスクリプト

Bash オートコンプリートスクリプト

1つの引数、フォルダ名、

には、/secure/kernel_builds/次の3つのサブフォルダがあります。

3.5.6/ 3.6.2/ source/

これで、すべてのサブフォルダ名を一覧表示するためにオートコンプリートが必要ですが、名前付きサブフォルダ名は一覧表示されませんsource。今、私は完成した単語が数字で始まっていることを確認することによってこれを行う非常に愚かな方法を使用しています。

_avail_kernel_builds()
{
    case $COMP_CWORD in
        1)
            if [[ "${COMP_WORDS[COMP_CWORD]}" =~ ^[0-9] ]];then
                COMPREPLY=( /secure/kernel_builds/"${COMP_WORDS[COMP_CWORD]}"* )
            else
                COMPREPLY=( /secure/kernel_builds/"${COMP_WORDS[COMP_CWORD]}"[0-9]*/ )
            fi
            COMPREPLY=( "${COMPREPLY[@]#/secure/kernel_builds/}" )
            COMPREPLY=( "${COMPREPLY[@]%/}" )
            ;;
    esac    
}

もっと良い方法がありますか?

ベストアンサー1

組み込み関数にはこの目的のためのcompgenパラメータがあります。-X

-X フィルタモード
    filterpat はファイル名拡張に使用されるパターンです。リストに適用されます
    前のオプションと引数によって生成された可能な完成、そしてそれぞれ
    一致を完了したFilterpatはリストから削除されます。先頭!フィルターに
    パターンを無効にします。この場合、filterpat と一致しない補完は削除されます。

したがって、おそらく次のようにすることができます。

_avail_kernel_builds() {
    case $COMP_CWORD in
        1) COMPREPLY=( $(cd /secure/kernel_builds; compgen -d -X "source") ) ;;
    esac
 }

したがって、compgen -d「現在のディレクトリのフォルダを一覧表示します」と-X "source"言い、「...しかし、「source」という名前のエントリをフィルタリングします。

おすすめ記事