如何为自定义Shell脚本添加终端Tab自动补全功能
如何为自定义Shell脚本添加终端Tab自动补全功能
嘿,这个需求超实用!我来一步步教你实现,分两种常见场景覆盖——一种是直接执行脚本(比如敲git-feature.sh)的补全,另一种是用.(也就是source命令)执行脚本的补全,毕竟你例子里写了. git-feature.sh,两种情况我都给你安排明白。
场景一:直接执行脚本时的Tab补全(最常用)
其实这是bash自带的能力,只要做好这几步就能生效:
给脚本加可执行权限:先给
~/bin里的所有脚本加上执行权限,终端里跑这条命令就行:chmod +x ~/bin/*.sh只有加了执行权限,bash才会把它们当作可执行命令来识别。
确认PATH配置生效:你已经把
~/bin加到.bashrc里了(比如加了export PATH="$HOME/bin:$PATH"),可以重启终端或者执行source ~/.bashrc让配置立刻生效。开启bash命令补全功能:大部分系统默认已经开启,但保险起见,终端里执行:
shopt -s progcomp现在测试一下:输入脚本的前几个字母(比如
git-fe),按Tab键,应该直接补全成git-feature.sh了!如果生效,把这条命令也加到你的.bashrc里,以后每次开终端都会自动开启这个功能。
场景二:用.(source)命令执行脚本时的补全
如果你习惯用. git-feature.sh这种方式执行脚本,bash默认只会补全当前目录的文件,不会自动搜索~/bin。那我们可以自定义补全规则解决这个问题:
- 打开你的
.bashrc文件:nano ~/.bashrc - 在文件末尾添加这段自定义补全函数:
# 为source命令补全~/bin下的.sh脚本 _source_custom_sh() { local current_input="${COMP_WORDS[COMP_CWORD]}" # 从~/bin里筛选.sh文件,生成补全候选 COMPREPLY=( $(compgen -f -X '!*.sh' -- "$HOME/bin/$current_input" | sed "s|$HOME/bin/||") ) } # 把这个函数绑定到`.`命令上 complete -F _source_custom_sh . - 保存退出后,执行
source ~/.bashrc让配置生效。
现在再测试:输入. git-fe然后按Tab,就会自动补全成. git-feature.sh,完全匹配你的需求!
备注:内容来源于stack exchange,提问作者Dreamer




