文章目录 需求 实现 依赖 函数 生效 注意 效果 本文主要讲解关于如何对bash脚本增加tab自动补全相关内容,让我们来一起学习下吧! 需求 高频使用自编benchmark工具,……
文
章
目
录
- 需求
- 实现
- 依赖
- 函数
- 生效
- 注意
- 效果
本文主要讲解关于如何对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
后续登陆则会自动生效
注意
- 函数中的
*)
一定要放再最后避免过度匹配无法进入其他逻辑 - 未将
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),学习愉快哦!
还没有评论呢,快来抢沙发~