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

zen*_*tom 5 bash tab-completion mailman

我需要 /mailman/lists 中的目录名称作为参数(不带任何斜线)以制表符完成作为“list_members”命令的参数,而不管我在文件系统中的哪个位置。

在 tcsh(在我们的旧服务器上),我写了一行来做我需要的:

complete list_members 'p,*,F:/mailman/lists,,' #tcsh
Run Code Online (Sandbox Code Playgroud)

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

制表符补全需要上下文相关,以便我已经输入的参数的任何部分缩小搜索范围,就像标准的 bash 补全一样。例子:

list_members sys<TAB> #only shows names beginning with sys
Run Code Online (Sandbox Code Playgroud)

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

一个失败的例子:

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

complete -F _listlists list_members
Run Code Online (Sandbox Code Playgroud)

这会产生错误:

-bash: compgen: warning: -C option may not work as you expect
Run Code Online (Sandbox Code Playgroud)

另一个失败的例子:

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

complete -F _listlists list_members
Run Code Online (Sandbox Code Playgroud)

这显示了该目录的所有结果通过管道传输到“更多”,但它不响应我已经输入的部分参数。

谢谢。

zen*_*tom 5

我的同事在我发布问题后立即提出了这个解决方案。它运作良好:

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
Run Code Online (Sandbox Code Playgroud)