需求
高频使用自编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