千家信息网

Linux中命令行补全的示例分析

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章给大家分享的是有关Linux中命令行补全的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在 Linux 系统中,当你输入一个命令,再按两次TAB 键,就会列
千家信息网最后更新 2026年11月03日Linux中命令行补全的示例分析

这篇文章给大家分享的是有关Linux中命令行补全的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

在 Linux 系统中,当你输入一个命令,再按两次TAB 键,就会列出所有以你输入字符开头的可用命令。这并不新鲜,可能你已经知道了。这个功能被称作命令行补全bash completion。默认情况下,bash 命令行可以自动补全文件或目录名称。不过,我们可以增强 bash 命令补全功能,通过 complete 命令让它达到新的高度。

这个教程说明了我们是怎样使用可编程的命令行补全功能(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即可:
# . /etc/bash_completion

你也可以取消/etc/bash.bashrc(来自 Ubuntu Linux 13.04 系统)中如下的注释,这样,你就可以不需要执行上面的命令了:

 ### 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 包即可。

1. 查看已有的命令行补全

在启用可编程的命令行补全功能后,就已经有了一些定义好的命令补全功能。complete 命令用于定义命令行补全。
要查看已有的命令行补全,如下使用 complete 命令:
complete -p | less
上面例子中的 -p 选项是可选的。

2. 列出 bash 中标准补全功能

默认情况下,Bash 为 Linux 用户提供了下列标准补全功能。
1.变量补全
2.用户名补全
3.主机名补全
4.路径补全
5.文件名补全

我们在之前的 bash 标准补全中讨论过这些。

3. 定义一个命令名补全

通过 -c 选项可以将所有的可用命令作为一个命令的补全参数。在下面的例子里面,为 which 命令定义了一个补全(LCTT译注:在按两下 TAB 时,可以列出所有命令名作为可补全的参数)。

 $ complete -c which$ which [TAB][TAB]Display all 2116 possibilities? (y or n)

如上,如果按下 'y',就会列出所有的命令名。

4. 定义一个目录补全

通过选项 -d,可以定义一个仅包含目录名的补全参数。在下面的例子中,为 ls 命令定义了补全。

 $ lscountfiles.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 '<"' ./list_job_attrib.sh$ ./list_job_attrib.sh [TAB][TAB]$ ./list_job_attrib.sh ">cat<"

7. 带有排除的文件名和目录名补全

假如脚本运行完成后,输出目录如下:

 $ cd output/$ lsall_calls.txt  incoming_calls.txt  outgoing_calls.txt  missed_calls.txtparser_mod.tmp extract.o

如上,如果你想要 ls 命令的补全忽略 .tmp 和 .o 文件:

$ 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 是一个环境变量,它包含了自动补全所需要排除的文件名后缀。

8. 通过 IFS 变量分割字符串得到补全值
可以通过 -W 选项定义补全值列表,然后通过 IFS 环境变量进行切分。切分结果会展开变量并作为补全显示。

$ export IFS=" "$ complete -W "bubble quick" ./sort_numbers.sh$ ./sort_numbers.sh [TAB][TAB]bubble  quick

如上所述,字符串通过 IFS 分隔符进行切分后,内嵌的变量会被展开为变量值,所以可以如下使用变量:

$ echo $SORT_TYPE1bubble$ echo $SORT_TYPE2quick$ complete -W "$SORT_TYPE1 $SORT_TYPE2" ./sort_numbers.sh$ ./sort_numbers.sh [TAB][TAB]bubble  quick

9. 写个函数来生成补全

你可以引入一个函数来定义补全。使用 -F 选项将函数名传给 complete 命令,执行函数生成补全内容。例如,函数如下:

 _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 后显示的结果
2.COMP_WORDS : 该数组包含命令行输入的单词
3.COMP_CWORD : COMP_WORDS 数组的索引,使用它来区分命令行可以访问的单词位置
4.compgen : -W 基于 $current_arg 提供可能的补全及其参数

该函数放在 parser_option 文件中,并通过 source 命令引入:
$ source parser_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 -o dirnames ./countfiles.sh
如上,为 ./countfiles.sh 定义了 _count_files 补全函数。 如果 the _count_files() 函数没有生成任何匹配的话,就会触发目录补全。

 $ ls countfiles.sh  dir1/   dir2/   dir3/$./countfiles.sh [TAB][TAB]dir1  dir2  dir3

感谢各位的阅读!关于"Linux中命令行补全的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

命令 函数 功能 参数 变量 文件 目录 生成 任务 例子 如上 内容 面的 可编 后台 后缀 可编程 输入 前缀 命令名 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技 互联网科技园 亿人帮互联网科技有限公司 朗新科技与工业互联网 互联网与科技金融数据 万易互联网科技有限公司 互联网科技视频 广州紫鲸互联网科技 亿人帮互联网科技 互联网科技英文翻译 天扬科技互联网广告 重庆科技学院互联网 山东吉时兔互联网科技有限公司 济南华为互联网科技产业总部基地 中国的互联网科技企业的崛起 科技赋能视角下互联网保险发展 烟台灵鸽互联网科技有限公司 科技互联网的核心竞争力 广州智享互联网科技 求路客互联网科技电话 圆梦互联网科技 互联网与科技发展 易互联网科技有限公司 卫星互联网科技股票 青岛中康互联网医疗科技有限公司 特约风豹互联网科技为什么扣费 中科明德北京互联网科技 山东大美朱楼互联网科技有限公司 山东蛋芒互联网科技有限公司 互联网金融金融科技
0