前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux Shell命令自动补全的实现

Linux Shell命令自动补全的实现

作者头像
PedroQin
发布2019-12-18 11:19:12
5.7K0
发布2019-12-18 11:19:12
举报
文章被收录于专栏:WriteSimpleDemo
背景介绍

最近在完成一个由linux shell脚本编写的工具时,发现在实现多个功能时,冗长的多个参数不仅难记而且大小写混杂,虽然“悉心”地写了完备的'-h'帮助文档,但是为了实现其中一个功能,仍然需要输入多个冗长的字符串来定位某个大选项下的小选项所对应的功能。

实现思路

在 linux shell 下本身有着体验极佳的命令补全功能,即[Tab][Tab]。现通过自定义该程序的命令补全脚本实现命令补全。

基础介绍
complete (补全命令)
代码语言:javascript
复制
[root@localhost ~]# help complete
complete: complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-W wordlist]  [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]

重点说明

代码语言:javascript
复制
执行shell 函数,函数中生成COMPREPLY作为候选的补全结果
compgen(筛选命令)

用来筛选生成匹配单词的候选补全结果

代码语言:javascript
复制
[root@localhost ~]# help compgen
compgen: compgen [-abcdefgjksuv] [-o option]  [-A action] [-G globpat] [-W wordlist]  [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [word]

重点说明:

Parameter

description

-W wordlist

分割 wordlist 中的单词,生成候选补全列表

compopt(修改补全命令设置)

用于修改补全命令设置,这个命令必须在补全函数中使用,否则会报错

代码语言:javascript
复制
[root@localhost ~]# help compopt
compopt: compopt [-o|+o option] [-DE] [name ...]

重点说明:

Parameter

description

+o option

启用 option 配置

-o option

弃用 option 配置

内置补全变量

除了上面三个命令外,Bash还有几个内置变量来辅助补全功能,如下:

variable

description

COMP_WORDS

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

COMP_CWORD

类型为整数,当前输入的单词在COMP_WORDS中的索引

COMPREPLY

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

COMP_WORDBREAKS

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

COMP_LINE

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

COMP_POINT

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

实例

注:本示例只针对实际应用场景做了简单实现,做个思路引子。更多强大功能请自行研究( • ̀ω•́ )✧

complete_tool.sh :

代码语言:javascript
复制
_service_tool()
{    COMPREPLY=()
   local cur=${COMP_WORDS[COMP_CWORD]}
   local cmd=${COMP_WORDS[COMP_CWORD-1]}    case $cmd in
   './odm_tools.sh')
    COMPREPLY=( $(compgen -W '--FirmwareUpgrade --Diagnose --ServerConfigCheck' -- $cur ) )
   ;;
    
    '--FirmwareUpgrade')
    COMPREPLY=( $(compgen -W '--AfterReplaceMotherBoard --BiosUpgrade --BmcUpgrade --NicUpgrade --RaidHbaUpgrade --PsuUpgrade' -- $cur ) )
   ;;
    
    '--Diagnose')
    COMPREPLY=( $(compgen -W '--FastTestForAllHardWare --CpuFastTest --MemoryFastTest --RaidHbaFastTest --NicFashTest --BmcFastTest --MemoryFullTest --CpuFullTest --AllLogCollect' -- $cur ) )
   ;;
    
    '--ServerConfigCheck')
    COMPREPLY=( $(compgen -W '--GetALLInfo --GetCpuInfo --GetMemoryInfo --GetHardDiskInfo --GetRaidHbaInfo --GetNicInfo --GetPsuInfo' -- $cur ) )
   ;;
   esac
    return 0
}
complete -F _service_tool ./odm_tools.sh

Before:

代码语言:javascript
复制
[root@localhost Service]# ./odm_tools.sh [Tab][Tab]
ChangeLog          files/             mkpackage.sh       odm_tools.sh        complete_tool.sh

导入补全脚本:

代码语言:javascript
复制
[root@localhost Service]# source complete_tool.sh
[root@localhost Service]#

再次尝试

代码语言:javascript
复制
[root@localhost Service]# ./odm_tools.sh -- [Tab][Tab]
--Diagnose           --FirmwareUpgrade    --ServerConfigCheck
[root@localhost Service]# ./odm_tools.sh --ServerConfigCheck --Get [Tab][Tab]
--GetALLInfo       --GetCpuInfo       --GetHardDiskInfo  --GetMemoryInfo    --GetNicInfo       --GetPsuInfo       --GetRaidHbaInfo
结语

可将编写好的脚本在用户根目录.bash_profile中进行调用,亦可放于/etc/bash_completion.d/下,这样在下次登录终端时即可自动source自动补全脚本。

祝大家元旦快乐!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WriteSimpleDemo 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景介绍
  • 实现思路
  • 基础介绍
    • complete (补全命令)
      • compgen(筛选命令)
        • compopt(修改补全命令设置)
          • 内置补全变量
          • 实例
          • 结语
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档