使用TAB键可以根据已输入的字符自动补全路径名、文件名和可执行程序,自动补全依赖于bash-completion在/etc/bash_completion.d/路径下创建的自动补全脚本。

实现简单的参数自动补全

自动补全的实现依赖于compgen和complete命令以及bash内置的补全变量,我们先看下面这个脚本:

# 脚本1: vtb.bash

_vtb()

{

local cur=${COMP_WORDS[COMP_CWORD]}

COMPREPLY=( $(compgen -W "mea aqua alice" -- $cur) )

}

complete -F _vtb vtb

赋予执行权限并测试:

> chmod +x vtb.bash

> source vtb.bash

> vtb

alice aqua mea

> vtb a

alice aqua

现在vtb这个命令已经具有了参数补全的功能,不难发现其给出的选项来自于_vtb函数中的COMPREPLY数组。

自动补全原理

内置补全变量表

变量名

功能

COMP_WORDS

类型为数组,存放当前命令行中输入的所有单词

COMP_CWORD

类型为整数,当前光标所在位置的单词在COMP_WORDS中的索引

COMPREPLY

类型为数组,候选的补全结果

COMP_WORDBREAKS

类型为字符串,表示单词之间的分隔符

COMP_LINE

类型为字符串,表示当前的命令行输入字符

COMP_POINT

类型为整数,表示光标在当前命令行的哪个位置

理解 compgen -W

在脚本1的_vtb函数中,我们首先定义了cur变量用于获取当前光标所在位置的单词,将其作为参数传递给compgen -W命令。该命令接受两个参数,定义与使用方式如下:

# compgen -W

> compgen -W "aqua alice mea" -- a # 省略‘--’则不会输出多行

aqua

alice

compgen命令的作用是完成候选词的筛选,-W模式代表从中获得候选词,然后通过参数对候选词进行筛选,最后我们将筛选得到的结果存入COMPREPLY数组中。

理解 complete -F

我们在脚本1中使用了complete命令的-F模式让vtb命令能够获取_vtb函数中的候选补全结果COMPREPLY,其本质就是完成候选词的绑定。我们先以简单的-W模式为例进行讲解,其定义与使用方式如下:

# complete -W

> complete -W "aa ab cd" test_comp

> test_comp

aa ab cd

> test_comp a

aa ab

complete命令可以给绑定候选词列表,根据不同的命令模式(-F -W -C -G)会有不同的构建候选词列表的方式。-W模式通过字符串构建候选词列表,而-F模式需要使用COMPREPLY构造候选词列表,其定义与使用方式如下:

complete -F # 绑定候选词列表

# 筛选候选词列表

该命令可以实现与的绑定,函数中必须通过COMPREPLY构造候选词列表,而是否使用compgen或其他方式进行候选词筛选取决于业务逻辑。相比于其他模式,-F模式能够提供更灵活的自动补全策略,以脚本1为例,我们通过组合使用compgen、complete和内置补全变量实现了类似-W模式的功能。

linux bash 自动补全,bash中的自动补全机制相关推荐

  1. java 自动拆箱_Java中的自动装箱拆箱

    Java中的自动装箱拆箱 一.自动装箱与自动拆箱 自动装箱就是将基本数据类型转换为包装类类型,自动拆箱就是将包装类类型转换为基本数据类型. 1 //自动装箱 2 Integer total = 90; ...

  2. matlab自动变量名,matlab中如何自动给变量命名?

    在大量数据处理中,如果单独给变量命名,无疑是一项简单.费时.重复性工作.matlab通过eval函数提供了自动命名变量的功能,见下面的例子: %%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...

  3. java 集合 自动排序的_java中的自动排序集合 ---- 20160809

    TreeSet的实现: TreeMap实现: 需要注意: 1. 当利用comparator比较两个元素相等时,插入的时候会失败.而hashset是发现两个元素相等时,插入失败返回false.这说明可能 ...

  4. html里如何禁止输入框自动提示,HTML中禁止自动完成和禁用输入法

    原标题:HTML中禁止自动完成和禁用输入法 现在一般浏览器会提供了一个自动完成功能可以记忆我们的输入内容(如登录帐号等),方便下一次快速地录入类似资料.这确实是一个非常友好的功能, 在操作时只需用鼠标 ...

  5. linux 函数自动补全,Shell脚本中实现自动补全功能

    对于Linuxer来说,自动补全是再熟悉不过的一个功能了.当你在命令行敲下部分的命令时,肯定会本能地按下Tab键补全完整的命令,当然除了命令补全之外,还有文件名补全. Bash-completion ...

  6. php ssh tab补全,bash的按TAB键自动补全(自动完成)的原理与扩展

    最近在用源码安装ceph,发现命令不能自动补全,然后找到了下面这篇文章,写的很好~转载一下~ 源码安装ceph命令没法自动补全的解决方法:把ceph-deploy安装的可以自动补全的系统里/etc/b ...

  7. Linux VPS服务器根据CPU负载及内存占用自动重启的bash shell脚本

    Linux VPS服务器根据CPU负载及内存占用自动重启的bash shell脚本 288月2011 0 主要用于监控 linux 服务器负载及内存占用,如 MySQl.php-fpm,当负载或内存占 ...

  8. oracle中日期自动补全,没有数据自动补0

    oracle中日期自动补全,没有数据自动补0 1. 描述 最近在项目中遇到一个问题,在进行oracle相关查询操作的时候,查询某个月的数据,这个月中某些日期没有数据,就造成了日期的缺失,我想做的就是不 ...

  9. linux shell 获取表,bash - 如何获取shell脚本中目录中的文件列表?

    bash - 如何获取shell脚本中目录中的文件列表? 我试图使用shell脚本获取目录的内容. 我的脚本是: for entry in `ls $search_dir`; do echo $ent ...

  10. VSCode中tab自动补全标签

    VSCode中tab自动补全标签 今天重置了vscode突然发现tab键不能补齐了,于是翻了翻以前记得笔记,就找到了方法. 进入setting.json文件 加入以下代码 "emmet.tr ...

最新文章

  1. 李白打酒c语言编程,搞定了“李白打酒”,还原问题都迎刃而解
  2. error C2039: IsOutRange
  3. 大话ion系列(一)
  4. 整理Linux查看系统日志的一些经常使用命令
  5. SQL Assistant v2.5.12 序列号
  6. jquery easy ui 1.3.4 事件与方法的使用(3)
  7. clinit和init(转载)
  8. 8位串行加法器 计算机组成原理,安尧-2013434158-计算机组成原理8位加法器实验报告.doc...
  9. 樱花大战资源分析之二 SPR文件格式不完全分析
  10. 10000电信固话如何设置呼叫转移
  11. SQL语句基础1:对数据库和表的增删改操作,初始化时约束和数据的加入
  12. vue组件开发之仿CSDN发布博客时面包屑标签和checkbox选中效果
  13. GEP基因表达式编程
  14. 华为交换机的应用案例(小)
  15. gitlab 安装以及卸载
  16. wrap(),wrapAll(),wrapInner()的区别
  17. 谷歌浏览器无法保存网站密码指引
  18. MATLAB基础学习(二)-变量类型与赋值
  19. vb中MSHFlexgrid控件小总结
  20. hp1015驱动64位_HP LaserJet1010 x64驱动下载|HP LaserJet1015 win7 x64驱动 - 驱动无忧

热门文章

  1. NUBT 1480 懒惰的风纪委Elaine
  2. 用 Python 编辑 PDF 文件
  3. LabVIEW如何将脚本插入Quick Drop
  4. 阿里云服务器ddos攻击防御
  5. 怎么给图片加边框线?图片加边框的方法
  6. 【斯坦福大学公开课CS224W——图机器学习】二、图机器学习中的传统方法(2)
  7. 计算机屏幕显示电缆借口,电脑打不开,显示电缆线没有连接是什么意思?
  8. Total Phase Data Center介绍
  9. STM32F103ZET6+红外温度传感器mlx90614芯片
  10. zblogphp 广告联盟_zblog模板添加广告位置的方法