bash 完成:列出定义目录中的目录名称?

bash 完成:列出定义目录中的目录名称?

无论我在文件系统中的什么位置,我都需要将 /mailman/lists 中的目录名称作为“list_members”命令的参数(不带任何斜杠)以制表符形式完成。

在 tcsh 中(在我们的旧服务器上),我写了一行来完成我需要的操作:

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

bash 的实现似乎更复杂。如何使用 bash 实现相同的行为?

Tab 补全需要上下文相关,这样无论我输入了什么部分参数,搜索范围都会缩小,就像标准 bash 补全一样。示例:

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

我查看了示例后尝试了一些解决方案,但它们都没有正常工作。

一个失败的例子:

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”的所有结果,但它没有响应我已经输入的部分参数。

谢谢。

答案1

在我发布问题后,我的同事立即想到了这个解决方案。效果很好:

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

答案2

我使用 HOME 文件夹测试了一个解决方案(我的主机上没有邮递员)。这就是您要找的吗?

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

相关内容