ファイルシステムのどこにいるかに関係なく、「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」にパイプされたそのディレクトリからのすべての結果を示していますが、すでに入力した部分的な引数には応答しません。
ありがとう。
私が質問を投稿した直後に、私の同僚がこの解決策を思いつきました。それはうまく機能します:
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
HOMEフォルダー(ホストに郵便配達員がいない)を使用してソリューションをテストしました。これはあなたが探しているものですか?
function _homes() {
local homes=("/home/$2"*)
[[ -e ${homes[0]} ]] && COMPREPLY=( "${homes[@]##*/}" )
}
complete -F _homes homes
alias homes='echo you selected:'