我创建了以下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?
答案 0 :(得分:4)
只需使用-G globpat
compgen的选项:
COMPREPLY=($(compgen -G "/upgrade/*.tgz.gpg" -- ${cur}));
如果由于某种原因你想要使用-W wordlist
(例如将文件名与其他内容混合),这也是可能的:
files=(/upgrade/*.tgz.gpg)
COMPREPLY=($(compgen -W '"${files[@]}"' -- ${cur}));
两个版本都应该正确处理包含空格的文件名(而你的变体不会)。