bash完成完整路径文件

bash完成完整路径文件,bash,bash-completion,Bash,Bash Completion,我创建了以下bash完成函数: _scpinst () { local cur prev opts; COMPREPLY=(); cur="${COMP_WORDS[COMP_CWORD]}"; prev="${COMP_WORDS[COMP_CWORD-1]}"; opts="-l"; if [[ ${prev} == '-l' ]]; then files=$(ls /upgrade/*.tgz.gpg 2>/de

我创建了以下bash完成函数:

_scpinst ()
{
    local cur prev opts;
    COMPREPLY=();
    cur="${COMP_WORDS[COMP_CWORD]}";
    prev="${COMP_WORDS[COMP_CWORD-1]}";
    opts="-l";
    if [[ ${prev} == '-l' ]]; then
            files=$(ls /upgrade/*.tgz.gpg 2>/dev/null);
            COMPREPLY=($(compgen -W "${files}" -- ${cur}));
            compopt -o nospace
            return 0;
    fi;
    COMPREPLY=($(compgen -W "${opts}" -- ${cur}));
    return 0
}

complete -F _scpinst scpinst
在-l标志后,它会自动完成/upgrade目录中的*.tgz.gpg文件。
有没有更好的方法不用使用“ls”命令来完成它。例如,使用-o文件名或-f?

只需使用
-g globpat
compgen的选项:

COMPREPLY=($(compgen -G "/upgrade/*.tgz.gpg" -- ${cur}));
如果出于某种原因,您希望准确地使用
-W wordlist
(例如,将文件名与其他内容混合),也可以:

files=(/upgrade/*.tgz.gpg)
COMPREPLY=($(compgen -W '"${files[@]}"' -- ${cur}));

两个版本都应该正确处理包含空格的文件名(而您的变体则不会)。

Ok。第二个很好用。第一个动作很奇怪。它很好地完成了文件名,但是当我从文件中键入另一个字符并点击选项卡时,它将删除添加的字符。