教你自定义 bash 的命令补全
complete命令介绍
linux和mac系统自带的complete命令非常强大,用法例如complete -F _ps ps表示当我们输入ps命令后会执行_ps这个函数来做补全,虽然强大但不容易使用,需要一些辅助工具帮我们做一些封装的工作
安装bash-completion
bash-completion是封装了complete命令的一套脚本(也为我们写好了一些常用命令的补全,但还不够)
mac系统安装方法:
brew install bash-completion
centos/rhel系统安装方法:
yum install bash-completion
其他linux系统安装方法类似
安装后会在/etc(brew安装的会在/usr/local/etc)下某个目录中生成bash_completion.sh文件和bash_completion.d目录,其中bash_completion.sh里面封装了一些有用的函数,需要加到.bash_profile里加载,而bash_completion.d目录则都是自定义的补全方法
在.bash_profile中添加
. /etc/bash_completion
具体路径随bash-completion安装目录修改
自定义补全参数
比如我希望在输入ps+空格后按TAB键自动帮我补全aux,则只需要在bash_completion.d目录创建一个文件,假如命名为ps,内容如下:
_ps()
{
COMPREPLY="aux"
return 0
} &&
complete -F _ps ps
重新登录bash后执行ps+空格+TAB键,是不是自动补全成ps aux?
解释:这里的_ps是一个函数,complete -F _ps ps表示当我输入ps时会按照_ps函数来指明补全逻辑,这里的COMPREPLY就是回写补全字符串的变量
按提示补全
比如我希望在输入ps+空格+a+TAB自动补全aux,在输入ps+空格+u+TAB自动补全ux,意思就是要根据参数的前缀来确定补全哪种参数,那么内容改成如下:
_ps()
{
local cur
_get_comp_words_by_ref cur
case $cur in
a*)
COMPREPLY="aux"
return 0
;;
u*)
COMPREPLY="ux"
return 0
;;
esac
return 0
} &&
complete -F _ps ps
解释:这里的_get_comp_words_by_ref是读取已经输入的前缀,判断$cur如果前缀是a,就补全aux,如果前缀是u就补全ux