对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
参考#
Shell Auto Completion in Linux | Baeldung on Linux
git pull while not in a git directory - Stack Overflow
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架