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)
这显示了该目录的所有结果通过管道传输到“更多”,但它不响应我已经输入的部分参数。
谢谢。
我的同事在我发布问题后立即提出了这个解决方案。它运作良好:
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)