本文分享自华为云社区《有用的LinuxBash_Completion命令示例(Steroids上的Bash命令行补全)》,作者:Tiamo_T。
在Linux中,在键入命令时,若果按两次TAB,它将列举所有以键入字符开头的可用命令。
这不是哪些新鲜事,可能你已然晓得了。此功能称为bash完成。默认情况下,基本文件和目录名称补全在bash命令行中可用。
然而,我们可以对这个bash补全进行加速,并使用complete命令将其提高到一个新的水平。
本教程解释了我们怎样使用可编程完成将手动完成应用于选项和命令的参数。
比如,在输入write命令后,假如按两次tab,手动补全会提供用户列表来执行write操作。
$ write [TAB][TAB]
bala raj
jason randy
john ritu
mayla thomas
nisha www-data
在以下示例中,它将显示telnet命令的可用主机名:
$ telnet [TAB][TAB]
localhost dev-db fileserver
要在终端中获得可编程完成,您只须要运行/etc/bash_completion,如下所示,
# . /etc/bash_completion
您还可以取消注释/etc/bash.bashrc(来自ubuntulinux13.04)中的以下行,这样您就毋须显式运行上述命令linux就该这么学,
enable bash completion in interactive shells
if ! 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
fi
fi
假如你没有找到这种行和/etc/bash_completion文件,这么你只须要通过apt-get安装名为bash_completion的包
1.查看现有的bash-completion
启用可编程bash完成后,定义了一组bash完成。命令complete用于定义bash完成。
要查看现有的bash完成,请使用如下所示的complete命令。
complete -p | less
在前面的示例中,选项-p是可选的。
2.Bash标准补全列表
Bash默认为Linux用户提供以下标准补全。
1.变量名完成2.用户名完成3.主机名完成4.路径名完成5.文件名完成
我们在之前的bash标准完成文章中讨论了那些内容。
3.定义获取命令的完成
使用-c命令定义完成以获取可用命令列表作为参数。在以下示例中,完成是为那个命令定义的,
$ complete -c which
$ which [TAB][TAB]
Display all 2116 possibilities? (y or n)
如上所示,通过按“y”,所有命令将被列举。
4.定义获取目录的完成
使用选项dlinux系统界面,可以将完成定义为仅获取目录名也称为参数。在以下示例中,为ls定义了完成,
$ ls
countfiles.sh dir1/ dir2/ dir3/
$ complete -d ls
$ ls [TAB][TAB]
dir1/ dir2/ dir3/
如上所示,按Tab仅显示目录。
5.定义获取后台作业名称的完成
使用完成,还可以获取作业名也称为命令的参数。选项j用于将作业名也称为参数传递给命令作业,如下所示,
$ jobs
[1]- Stopped cat
[2]+ Stopped sed 'p'
$ complete -j ./list_job_attrib.sh
$ ./list_job_attrib.sh [TAB][TAB]
cat sed
提到后台作业,您还应当晓得怎样使用这种示例管理Linux后台作业。
6.前缀和后缀补全
可以使用要添加的所需前缀和要附加实际完成的后缀来定义完成。在以下示例中,为list_job_attrib.sh定义了前缀和后缀,
$ jobs
[1]+ Stopped cat
$ complete -P '">' -S 'cat<"
7.文件名和目录完成与排除
考虑脚本完成运行,输出被写入输出目录,如下所示
$ cd output/
$ ls
all_calls.txt incoming_calls.txt outgoing_calls.txt missed_calls.txt
parser_mod.tmp extract.o
在里面,假若您须要忽视.tmp和.o文件以使用ls命令手动完成,这么,
$ export FIGNORE='.tmp:.o'
$ complete -f -d ls
$ cd output
$ ls [TAB][TAB]
all_calls.txt incoming_calls.txt outgoing_calls.txt missed_calls.txt
FIGNORE是包含文件名后缀的shell变量,这种后缀在手动完成中被排除。
8.通过IFS分拆字符串以获得完成值
可以使用-W选项提到词组列表linux 没有export命令,并使用IFS变量中的值进行分拆。之后每位结果词组都被扩充并显示为完成,
$ export IFS=" "
$ complete -W "bubble quick" ./sort_numbers.sh
$ ./sort_numbers.sh [TAB][TAB]
bubble quick
如上所述,通过IFS分隔符分割字符串后,词组得到扩充linux 没有export命令,因而也可以将这种作为变量,如下所示,
$ echo $SORT_TYPE1
bubble
$ echo $SORT_TYPE2
quick
$ complete -W "$SORT_TYPE1 $SORT_TYPE2" ./sort_numbers.sh
$ ./sort_numbers.sh [TAB][TAB]
bubble quick
9.编撰你自己的函数来世成完成
它容许您包含一个函数来定义完成。使用-F选项,传递给完成命令的函数名称并被执行以生成完成。诸如,函数编撰如下所示,
_parser_options()
{
local curr_arg;
curr_arg=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(compgen -W '-i --incoming -o --outgoing -m --missed' -- $curr_arg ) );
}
在上述函数中,
1.COMPREPLY:链表保存按[TAB][TAB]后显示的完成结果2.COMP_WORDS:在命令行上键入的词组链表3.COMP_CWORD:COMP_WORDS链表的索引,而且可以在命令行上使用此不同位置的词组进行访问。pgen:-W保存可能的完成,并按照$current_arg选择相应的参数
文件parser_option中存在的此函数的来源如下所示,
$ source parser_option
将此函数链接到您的解析器脚本,如下所示,
$ complete -F _parser_options ./parser.pl
$ ./parser.pl [TAB][TAB]
-i --incoming -o --outgoing -m --missed
如上所示,解析器的选项由函数_parser_options()生成。
注意:查看/etc/bash_completion以查看可编程完成的更多功能。
10.当主要不生成任何辅助规范时
假如定义的完成规范没有生成匹配项,则使用comp-option来完成-o选项提及的完成。
$ complete -F _count_files -o dirnames ./countfiles.sh
如上所述,完成是用文件./countfiles.sh的_count_files函数定义的。假如_count_files()函数未生成任何匹配项,则尝试完成目录。
$ ls
countfiles.sh dir1/ dir2/ dir3/
$./countfiles.sh [TAB][TAB]
dir1 dir2 dir3