![bash 完成:列出定义目录中的目录名称?](https://linux22.com/image/1439760/bash%20%E5%AE%8C%E6%88%90%EF%BC%9A%E5%88%97%E5%87%BA%E5%AE%9A%E4%B9%89%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E7%9B%AE%E5%BD%95%E5%90%8D%E7%A7%B0%EF%BC%9F.png)
无论我在文件系统中的什么位置,我都需要将 /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:'