我已经定义了一个bash_completion脚本。在某些情况下,我希望回到大多数命令默认情况下基于文件的基本完成。要做到这一点,我使用的是compgen,但我不能让它下降到子目录。
假设我在一个目录中运行compgen,其中包含一个名为bin的目录。当我运行compgen -f bi时,我会得到bin。我希望它返回bin/,然后允许我再次将TAB推入到bin目录的内容中。但是,相反,complete只获得一个值,并假定它已到达处理的末尾。这与bash完成在ls bi[TAB]将导致ls bin/的一般情况下的工作方式不同。
由于我无法使它工作,目前我已经编写了自定义代码,这些代码深入目录以执行正确的bash完成,但是必须有一种直接使用compgen的方法。
发布于 2022-09-30 12:30:52
我的头一直撞在这堵砖墙上(没有双关的意思)。刚刚意识到,诀窍不在于如何在自定义完成函数中调用compgen,而在于如何告诉complete处理它,特别是您需要告诉它将函数的结果作为文件名来处理(因此,如果给出了一个目录,则让您进入它):
complete -o filenames -F _mycmd_completions mycmd在内部,对于我的自定义函数,我也做了以下工作来匹配dir和文件(包括处理带有空格的文件/dir):
_mycmd_completions()
{
local IFS=$'\n\t'
local word="${COMP_WORDS[$COMP_CWORD]}"
local values=($(compgen -d -- "$word") $(compgen -f -- "$word"))
# Processing on values ...
COMPREPLY=(${values[@]})
}https://stackoverflow.com/questions/39948985
复制相似问题