大家在Linux下都用shell的TAB自动补全功能,非常方便,但是有时自己开发程序,可能需要自定义实现TAB自动补全功能,这时可能就会用到complete命令来实现对命令的自定义补全,本文主要介绍complete的用法,下一篇会着重介绍对ssh的自动补全的实现。
首先先看一个非常简单的例子:
$ # Create a dummy command: $ touch ~/bin/myfoo $ chmod +x ~/bin/myfoo $ # Create some files: $ touch a.bar a.foo b.bar b.foo $ # Use the command and try auto-completion. $ # Note that all files are displayed: $ myfooa.bar a.foo b.bar b.foo $ # Now tell bash that we only want foo files. $ # This command tells bash args to myfoo are completed $ # by generating a list of files and then excluding $ # everything # that doesn't match *.foo: $ complete -f -X '!*.foo' myfoo $ # Tray again: $ myfoo a.foo b.foo
complete [-abcdefgjksuv] [-o comp-option] [-A action] [-G globpat] [-W wordlist] [-P prefix] [-S suffix] [-X filterpat] [-F function] [-C command] name [name ...]
complete -C "pwd" ls # ls的自动补全为当前目录 complete -G "*.py" ls # ls的自动补全为.py文件 complete -X "*.py" ls # ls的自动补全为非.py文件
function _mycomplete_() { local cmd="${1##*/}" # 当前命令 local word=${COMP_WORDS[COMP_CWORD]} #当前输入的字符串 local line=${COMP_LINE} #整行字符串 local xpat='*.py' # pattern # 根据word的值来补全当前非.py的文件file. COMPREPLY=($(compgen -f -X "$xpat" -- "${word}")) } # _mycomplete_函数可定义在.bash_profile中,然后执行 source ~/.bash_profile # 当然也可多个命令共用一个function, 只要_myfunction_作区分即可,比如对cmd执行case语句 # 生成不同的xpat complete -F _mycomplete_ myfoo #使用_mycomplete 作为myfoo的自动补全