1 开发环境
Ubuntu14.04
Bash Shell
2 前言
自编写的Shell脚本,很多时候都需要输入一定的参数。当参数较多而且较复制的时候,如果能使用Tab键补全就显得非常的便利。本文专门为此实现此目的而编写。
3 compgen & complete
自动补全是Bash Shell的功能(Dash Shell就没有这么好的功能了[7]),主要是利用了其内建的两个命令compgen和complete。
3.1 compgen
示例:
compgen -W "aa ab bb cc" -- "a"
解析:
表示从"aa ab bb cc" 匹配出以“a”开头的单词,上述命令的返回结果就是 “aa ab”:
3.2 complete
语法:complete 补全行为选项 命令名[4]
解析:可用的行为选项如下所示[4]:
-F:执行指定函数名,候选结果保存在 COMPREPLY 数组变量里,补全功能更强大,可以实现命令参数补全,函数名在 /etc/bash_completion定义的。
-f:补全文件名,后可跟 -X 参数。
-X:过滤表达式,符合表达式的文件名会被排除,即不会在补全候选显示出来,如果以感叹号开头,则表示反转,即符合表达式的文件名才显示。
-o:补全类型,filenames 表示补全的是一个文件,跟 -f 参数使用才有效;其它值如dirnames 表示补全目录。
示例1: /* 使用my_complete_func函数(自定义)来对my_cmd进行补全. */
complete -F my_complete_func my_cmd
示例2: /* my_cmd只进行文件名补全. */
complete -f my_cmd
示例3: /* my_cmd只进行目录补全 */
complete -o dirnames my_cmd
示例4: /* my_cmd只补全文件 */
complete -o filenames -f my_cmd
示例5: /* 查询当先实现的补全命令 */
complete
4 定制自动补全选项
本小结根据网上的资料总结如何为自定义的Shell脚本定制个性化的自动补全项目。
4.1 hello.sh
新建一个文件hello.sh,然后在其中输入:
#!/bin/bash
echo "hello world"
保存上述内容,然后:
chmod +x hello.sh
将hello.sh所在路径添加到PATH环境变量中。
4.2 hello_complete创建一个文件hello_complete,然后输入如下内容:
complete -F hello_complete_func hello.sh
_helloworld_complete_func()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="help usage version"
if [[ ${cur} == * ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
注:上述的opts并不是一个字符串数组,而仅仅是一个字符串!
4.3 测试补全效果
source hello_complete
hello.sh [Tab][Tab]
参考资料
[3]Working more productively with bash 2.x/3.x
[5]我使用过的Linux命令之complete - 强劲的bash参数补全功能