bash完成完整路径文件
我创建了以下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
_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。第二个很好用。第一个动作很奇怪。它很好地完成了文件名,但是当我从文件中键入另一个字符并点击选项卡时,它将删除添加的字符。