这篇文章与华为云社区的《有用的LinuxBash_Completion命令示例(Steroids上的Bash命令行补全)》一书共享
在Linux中,如果用户需要对程序进行修改或升级时,只需再输入两次"TAB",就能自动生成新的键入字符和可用命令
这个问题并不新鲜,也许您早就有所了解不过,如果你的电脑没有安装任何软件的话,bash也是一个不错的选择在Bash命令下用鼠标点击指定的文件夹或文件名,就能自动恢复该文件夹或文件名中所有的内容。但如果没有这个程序的话,也可以实现类似的功能在一些情况下,例如当用户需要对某些基本文件进行修改时,如目录名称补全等,bash命令行是必不可少的工具
但我们可以加速这种bash补全并且用complete命令来把它升级
在这种情况下,用户只需输入一个简单的指令就能完成所有功能,如:查询、修改文件、显示和打印等,而且还可通过可编程的选项或命令来实现这些功能
比如当输入write命令时,自动补全若按2次tab将给出用户列表进行write操作
$write[TAB][TAB]balarajjasonrandyjohnritumaylathomasnishawww-data.
下面的例子会显示可使用telnet命令主机名:
$telnet[TAB][TAB]localhostdev-dbfileserver.
为了得到终端上可编程完成的结果,你只要操作/etc-bash-completion就可以了,下面是
你也可以从ubuntulinux13.04上撤销注释/etc/bash.bashrc的下列行以使你不需要显式地操作以上指令
enablebashcompletionininteractiveshellsif! shopt-oqposix;thenif[-f/usr/share/bash-completion/bash_completion];then. /usr/share/bash-completion/bash_completionelif[-f/etc/bash_completion];then. /etc/bash_completionfifi
如果您找不到这些行和文/etc.bash.c_mpletion,则您仅需通过apt-get来安装一个称为bash-completions的数据包
启用可编程的bash执行之后定义bash执行集合当一个对象被启动时,该对象的状态可以是:可执行部分,不可见部分和不可执行部分。在此情况下,可以用命令context来实现上述操作指令complete是用来定义bash来执行的
查看当前bash执行情况,可以用下面complete命令
complete-p|less.
以上例子可选方案-p
用-c命令的定义结束,得到可利用的命令列表,以此为参数如果这些被指定的命令与所选择的一个或多个执行环境有关,则将它们添加到相应的操作指令表中。此外还提供了用于确定该命令是否已由用户选定的方法和程序下面的例子中完成针对哪一条指令来定义
$complete-cwhich$which[TAB][TAB]Displayall2116possibilities? function(yorn)
如前所述,所有的指令都会以按下"y"的方式列出
使用方案d时,可定义完成是只得到目录的名称为参数如果需要对一个或多个项进行操作,则只需执行其中的一项即可。因此,可根据所选项目来创建新功能和选择相应项以实现指定目的。这种方法很容易理解下面的例子是ls的定义完
$lscountfiles.shdir1/dir2/dir3/$complete-dls$ls[TAB][TAB]dir1/dir2/dir3/
如前所述,根据Tab只显示一个目录
用完了也能得到作业名称为指令的一个参数2.用户在输入操作指令时,首先选择一个或多个菜单中的选项,然后再执行相应的操作步骤。3.当选中某个项目后,可直接显示该项目的属性信息和相关内容选项j是用来把作业名称以参数的形式转移到命令作业中的。下面是
$jobs[1]-Stoppedcat[2]Stoppedsed"p"$complete-j./list_job_attrib.sh$./list_job_attrib.sh[TAB][TAB]catsed.
说到后台作业你也应该了解怎样利用这些实例来管理Linux的后台作业
可利用需要增加的必要前缀,以及需要额外实际执行的后缀,定义执行任务为了使这些前缀或后缀能够被正确地表示出来,必须对其进行分析以确定它们之间是否存在某种关系,并将结果记录在文件里。这种方法称为文件系统分析(FSA)技术下面的例子是list_job_attrib.sh的前缀与后缀的定义
$jobs[1]Stoppedcat$complete-P"-S"./list_job_attrib.sh$./list_job_attrib.sh[TAB][TAB]$./list_job_attrib.sh"cat"
考虑脚本执行完操作后将输出写到输出目录下
$cdoutput/$lsall_calls.txtincoming_calls.txtoutgoing_calls.txtmissed_calls.txtparser_mod.tmpextract.o.
上文提到的。tmp、.o文件需要无视来用ls命令来自动执行的话
$exportFIGNORE=".tmp:.o"$complete-f-dls$cdoutput$ls[TAB][TAB]all_calls.txtincoming_calls.txtoutgoing_calls.txtmissed_calls.txt.
FIGNORE就是一个shell变量,它含有文件名的后缀,当自动完成时,它们就会被剔除
可通过-W选项来参考单词列表和IFS变量的数值来拆分单词当选择了一个或多个词时,将在屏幕上呈现包含所有候选词条的文本集(例如TextOf).通过对这些词赋予不同的权重来确定其重要性再将每一个结果单词展开,展示成完成
$exportIFS=$complete-W"bubblequick"./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]bubblequick.
它可以让你包含函数,并定义执行用-F选项,将函数名称转移到完成指令中,执行该指令,产生完成在许多情况下,我们可以不要求用户输入任何代码就能自动创建或修改这些功能。因此,如果需要的话,只需对软件进行简单操作即可实现上述目的如函数的书写为:
_parser_options(){localcurr_arg;curr_arg=${COMP_WORDS[COMP_CWORD]}COMPREPLY=($(compgen-W"-i--incoming-o--outgoing-m--missed"--$curr_arg));}
从以上函数来看
文件parser_option存在该功能的由来见下表
sourceparser_option
把这个功能与你的解析器脚本联系起来。下面是
$complete-F_parser_options./parser.pl$./parser.pl[TAB][TAB]-i--incoming-o--outgoing-m--missed.
如前所述,解析器选项是通过功能_parser/options(?)产生
注:请观看/etc.bash.c_mpletion,以便观看可编程地执行更多的功能
在定义完成规范未产生匹配项的情况下,采用comp-option完成-o选项中所指的完成
$complete-F_count_files-odirnames./countfiles.sh.
正如上文所述,该完成由一个文件。/countfiles.sh中的_count_files函数来定义当使用此方法时,首先将指定文件名和属性值保存在系统中;然后根据用户选择的操作方式对文件进行处理,如修改或删除等;最后将结果返回给用户如果_count_files()函数没有产生任何匹配项,那么就试着去完成目录
$lscountfiles.shdir1/dir2/dir3/$./countfiles.sh[TAB][TAB]dir1dir2dir3.