
这个教程说明了我们是怎样使用可编程的命令行补全功能(programmable completion)把自动补全功能应用于选项或者命令行参数。
例如:在输入 write 命令之后,如果你按两次 TAB 按键,自动补全功能会提供可供执行 write 操作的用户列表。
$ write [TAB][TAB]bala rajjason randyjohn ritumayla thomasnisha www-data在下面的例子中,可以为 telnet 命令显示可用的主机名:
$ telnet [TAB][TAB]localhost dev-db fileserver要让可编程命令补全功能在你的终端起作用 ,你只需要如下执行/etc/bash_completion即可:
### enable bash completion in interactive shellsif ! shopt -oq posix; then if [ -f /usr/share/bash-completion/bash_completion ]; then. /usr/share/bash-completion/bash_completion elif [ -f /etc/bash_completion ]; then. /etc/bash_completion fifi如果你没有发现这些代码,也没有找到/etc/bash_completion文件,那么你只需要通过使用apt-get命令来安装bash_completion 包即可。
$ complete -c which$ which [TAB][TAB]Display all 2116 possibilities? (y or n)如上,如果按下 ‘y",就会列出所有的命令名。
$ lscountfiles.sh dir1/ dir2/ dir3/$ complete -d ls$ ls [TAB][TAB]dir1/ dir2/ dir3/如上,连按下 TAB 仅会显示目录名。
$ jobs[1]- Stopped cat[2]+ Stopped sed "p"$ complete -j ./list_job_attrib.sh$ ./list_job_attrib.sh [TAB][TAB]catsed关于后台任务,你可以参考 Linux 后台任务中的例子了解如何管理后台任务。
$ jobs [1]+ Stopped cat$ complete -P "">" -S "<"" ./list_job_attrib.sh$ ./list_job_attrib.sh [TAB][TAB]$ ./list_job_attrib.sh ">cat<"7. 带有排除的文件名和目录名补全
$ cd output/$ lsall_calls.txtincoming_calls.txtoutgoing_calls.txtmissed_calls.txtparser_mod.tmp extract.o如上,如果你想要 ls 命令的补全忽略 .tmp 和 .o 文件:
$ export FIGNORE=".tmp:.o"$ complete -f -d ls$ cd output$ ls [TAB][TAB]all_calls.txtincoming_calls.txtoutgoing_calls.txtmissed_calls.txtFIGNORE 是一个环境变量,它包含了自动补全所需要排除的文件名后缀。
$ export IFS=" "$ complete -W "bubble quick" ./sort_numbers.sh$ ./sort_numbers.sh [TAB][TAB]bubblequick如上所述,字符串通过 IFS 分隔符进行切分后,内嵌的变量会被展开为变量值,所以可以如下使用变量:
$ echo $SORT_TYPE1bubble$ echo $SORT_TYPE2quick$ complete -W "$SORT_TYPE1 $SORT_TYPE2" ./sort_numbers.sh$ ./sort_numbers.sh [TAB][TAB]bubblequick9. 写个函数来生成补全
_parser_options(){ local curr_arg; curr_arg=${COMP_WORDS[COMP_CWORD]} COMPREPLY=( $(compgen -W "-i --incoming -o --outgoing -m --missed" -- $curr_arg ) );} 在上述函数中:$ complete -F _parser_options ./parser.pl$ ./parser.pl [TAB][TAB]-i--incoming-o--outgoing-m--missed如上,parser.pl 的选项是由函数 _parser_options() 生成的。
$ ls countfiles.shdir1/ dir2/ dir3/$./countfiles.sh [TAB][TAB]dir1dir2dir3以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。