当前位置: 首页 > 科技观察

【教程】Linux十个有用的命令行补全例子

时间:2023-03-12 21:27:48 科技观察

在Linux系统中,当你输入一个命令,按两次TAB键时,会列出所有以你输入的字符开头的可用命令。这不是什么新鲜事,您可能已经知道了。此功能称为命令行完成bash完成。默认情况下,bash命令行可以自动完成文件名或目录名。但是,我们可以通过complete命令增强bash命令补全,将其提升到新的高度。本教程解释了我们如何使用可编程完成将自动完成应用于选项或命令行参数。例如:键入写命令后,如果按两次TAB键,自动完成功能将提供可以执行写操作的用户列表。$write[TAB][TAB]balarajjasonrandyjohnritumaylathomasnishawww-data在以下示例中,可以为telnet命令显示可用的主机名:$telnet[TAB][TAB]localhostdev-dbfileserver启用可编程命令完成功能在您的终端中工作,您只需要执行/etc/bash_completion如下:/etc/bash_completion你也可以在/etc/bash.bashrc(来自UbuntuLinux13.04系统)中取消注释以下内容,这样你就不需要执行上面的命令:###enablebashcompletionininteractiveshellsif!shopt-oqposix;然后如果[-f/usr/share/bash-completion/bash_completion];然后。/usr/share/bash-completion/bash_completionelif[-f/etc/bash_completion];然后。/etc/bash_completionfifi如果你没有找到这些代码和/etc/bash_completion文件,那么你只需要使用apt-get命令安装bash_completion包即可。1.查看已有的命令行补全启用可编程命令行补全功能后,已经有一些定义好的命令补全功能。complete命令用于定义命令行完成。要查看现有的命令行补全,请使用以下完整命令:complete-p|less上例中的-p选项是可选的。2.列出bash中的标准补全函数Bash默认为Linux用户提供了以下标准补全函数。◆变量补全◆用户名补全◆主机名补全◆路径补全◆文件名补全我们之前在bash标准补全中讨论了这些。3.定义一个命令名补全通过-c选项,所有可用的命令都可以作为一个命令的补全参数。在下面的示例中,为which命令定义了一个补全$complete-cwhich$which[TAB][TAB]Displayall2116possibility?(yorn)同上,如果按下'y',所有的命令名称都会被列出。4.定义一个目录补全使用选项-d,你可以定义一个只包含目录名的补全参数。在下面的示例中,完成是为ls命令定义的。$lscountfiles.shdir1/dir2/dir3/$complete-dls$ls[TAB][TAB]dir1/dir2/dir3/如上,双击TAB只会显示目录名。5.定义一个后台任务名completion完成函数也可以使用任务名作为完成参数。选项-j可以定义任务名称作为传递给命令的参数,如下所示:$jobs[1]-Stoppedcat[2]+Stoppedsed'p'$complete-j./list_job_attrib.sh$./list_job_attrib.sh[TAB][TAB]catsed关于后台任务,可以参考Linux后台任务中的例子,了解如何管理后台任务。6.带前缀和后缀的补全补全函数可以为实际的补全内容定义前缀和后缀。在下面的示例中,补全内容的前缀和后缀是为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<"#p#7。补全文件名和目录名,如果脚本运行完毕,输出目录如下:完成ls命令以忽略.tmp和.o文件:$exportFIGNORE='.tmp:.o'$complete-f-dls$cdoutput$ls[TAB][TAB]all_calls.txtincoming_calls.txtoutgoing_calls.txtmissed_calls.txtFIGNORE是一个环境变量,其中包含需要被自动完成排除的文件名后缀。8.通过IFS变量拆分字符串得到完成值可以通过-W选项定义完成值列表,然后通过IFS环境变量拆分。分片结果扩展变量并显示为完成。$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]气泡quick9。编写一个函数来生成补全您可以引入一个函数来定义补全。使用-F选项将函数名传递给complete命令,执行函数生成completion内容。例如函数如下:_parser_options(){localcurr_arg;curr_arg=${COMP_WORDS[COMP_CWORD]}COMPREPLY=($(compgen-W'-i--incoming-o--outgoing-m--missed'--$curr_arg));}在上面的函数中:◆COMPREPLY:此数组控制按TAB后显示的结果◆COMP_WORDS:此数组包含在命令行中输入的单词Compgen:-W基于$current_arg,提供可能的补全及其参数。此函数放在parser_option文件中并通过source命令导入:$sourceparser_option将此函数与您的parser.pl脚本相关联:$complete-F_parser_options./parser.pl$./parser.pl[TAB][TAB]-i--incoming-o--outgoing-m--missed如上,parser.pl的选项是由函数_parser_options()生成的。提示:请参阅/etc/bash_completion了解更多可编程完成功能。10.当第一个规则没有产生结果时,使用第二个。如果定义的补全规则没有生成匹配项,您可以使用-o选项生成补全。$complete-F_count_files-odirnames./countfiles.sh如上,为./countfiles.sh定义了_count_files补全函数。如果_count_files()函数未产生匹配项,则会触发目录完成。$lscountfiles.shdir1/dir2/dir3/$./countfiles.sh[TAB][TAB]dir1dir2dir3