linux bash 自动补全,bash中的自动补全机制

使用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模式的功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值