bash完成完整路径文件

时间:2014-06-17 10:46:33

标签: 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>/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 filenames或-f?

1 个答案:

答案 0 :(得分:4)

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

COMPREPLY=($(compgen -G "/upgrade/*.tgz.gpg" -- ${cur}));

如果由于某种原因你想要使用-W wordlist(例如将文件名与其他内容混合),这也是可能的:

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

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