web-dev-qa-db-ja.com

bash完了:定義されたディレクトリからディレクトリ名を一覧表示しますか?

ファイルシステムのどこにいるかに関係なく、「list_members」コマンドの引数として(スラッシュなしで)タブを完成させるには、/ mailman/lists内のディレクトリ名が必要です。

Tcsh(古いサーバー上)で、必要なことを実行するために1行を記述しました。

complete list_members 'p,*,F:/mailman/lists,,' #tcsh

bashの実装はもっと複雑なようです。 bashを使用してこれと同じ動作を実装するにはどうすればよいですか?

タブ補完は、標準のbash補完と同じように、既に入力した引数のどの部分でも検索を絞り込むことができるように、状況依存である必要があります。例:

list_members sys<TAB> #only shows names beginning with sys

例を見た後、いくつかの解決策を試しましたが、正しく機能しません。

1つの失敗例:

function _listlists()
{
    COMPREPLY=( $( compgen -C 'ls /mailman/lists' ) )
}

complete -F _listlists list_members

エラーが発生します:

-bash: compgen: warning: -C option may not work as you expect

別の失敗例:

function _listlists()
{
    cd /mailman/lists
    COMPREPLY=( $( compgen -d ) )
    cd -
}

complete -F _listlists list_members

これは、「more」にパイプされたそのディレクトリからのすべての結果を示していますが、すでに入力した部分的な引数には応答しません。

ありがとう。

4
zenatom

私が質問を投稿した直後に、私の同僚がこの解決策を思いつきました。それはうまく機能します:

function _listlists()
{
    local cur
    COMPREPLY=()
    cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=($( compgen -W "$(ls -d /mailman/lists/*/|cut -d "/" -f 4)" -- $cur ) )
}

complete -F _listlists list_members
4
zenatom

HOMEフォルダー(ホストに郵便配達員がいない)を使用してソリューションをテストしました。これはあなたが探しているものですか?

function _homes() {
    local homes=("/home/$2"*)
    [[ -e ${homes[0]} ]] && COMPREPLY=( "${homes[@]##*/}" )
}
complete -F _homes homes
alias homes='echo you selected:'
2
return42