如何对bash脚本增加tab自动补全

后端 潘老师 3个月前 (12-04) 63 ℃ (0) 扫码查看

本文主要讲解关于如何对bash脚本增加tab自动补全相关内容,让我们来一起学习下吧!

需求

高频使用自编benchmark工具,
希望能像原生命令一样tab补全。
要求:

  • 能够针对-s补全指定数据集名称
  • 能够针对-b补全分支名称(基于本地git仓库)
  • 能够补全-d -e -q等普通参数

实现

依赖

常见Linux发行版都内置了自动补全的依赖,以Ubuntu默认shell bash为例
如无法自动补全需要手动安装sudo apt install bash-completion

函数

系统的自动补全默认source ~/.bash_completion因此我们可以从这里入手
假设工具入口benchmark代码仓库地址$HOME/workspace/src/.git

function _bench()
{
  latest="${COMP_WORDS[$COMP_CWORD]}"
  prev="${COMP_WORDS[$COMP_CWORD - 1]}"
  words=""
  case "${prev}" in
    -s)
      words="Argoverse Waymo Kitti CityScapes"
      ;;
    -b)
      words=`git --git-dir=$HOME/workspace/src/.git for-each-ref --format='%(refname:short)' refs/heads/`
      ;;
    *)
      words="-b -d -e -q -s"
      ;;
  esac
  COMPREPLY=($(compgen -W "$words" -- $latest))
  return 0
}
complete -F _bench benchmark

生效

首次使用需要手动source ~/.bash_completion后续登陆则会自动生效

注意

  1. 函数中的*)一定要放再最后避免过度匹配无法进入其他逻辑
  2. 未将benchmark注册到$PATH最后一行可改为complete -F _bench ./benchmark
    同时为了避免其他路径的./benchmark激活补全需要再_bench()函数头部增加路径过滤
function _bench()
{
  full_path=`realpath ${COMP_WORDS[0]}`
  if [ $full_path != "/path/to/your/script/benchmark" ];then
    # not in desire path, do nothing
    return 0
  fi
...
}
complete -F _bench ./benchmark

效果

$ ./test_entrance.sh -[Tab]
-b  -d  -e  -q  -s  
$ ./test_entrance.sh -s [Tab]
Argoverse   Waymo   Kitti   CityScapes
$ ./test_entrance.sh -s Waymo -b [Tab]
bugfix/xxxxx/bad_vx       bugfix/yyyyyyyy/crossing        feature/zzz/enable_dnn
master                    develop                         hotfix/zzz/Asan
$ ./test_entrance.sh -s Waymo -b master -q

以上就是关于如何对bash脚本增加tab自动补全相关的全部内容,希望对你有帮助。欢迎持续关注潘子夜个人博客(www.panziye.com),学习愉快哦!


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/12088.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】