命令行工具越来越多之后,自动补全几乎就是基础设施。如果补全脚本放得不对,最常见的问题不是“不能用”,而是 shell 启动越来越慢。
这篇文章只讲一个核心问题:在 Bash 和 Zsh 里,补全脚本到底该放哪。
Bash 的推荐位置
用户级最标准的位置是:
~/.local/share/bash-completion/completions/
这里的规则很严格:
- 文件名必须与命令名完全一致
- 不要带
.bash、.sh之类后缀
例如程序名是 zeroclaw,那文件名就应该直接叫:
~/.local/share/bash-completion/completions/zeroclaw
生成方式通常像这样:
mkdir -p ~/.local/share/bash-completion/completions
zeroclaw completions bash > ~/.local/share/bash-completion/completions/zeroclaw
为什么不推荐 source <(...)>
很多工具都会给你一个“快速启用”的写法:
source <(tool completions bash)
它能用,但更像临时测试方案。原因很简单:
- 每次启动 shell 都要重新执行一次
- 补全逻辑会在启动时整体加载
- 工具多了以后,启动延迟会越来越明显
而放到 bash-completion 的标准目录里,通常是按需加载,启动成本更低。
Bash 怎样立即生效
最简单的方法就是重新打开一个终端。如果想在当前 shell 里手动生效:
. /usr/share/bash-completion/bash_completion
验证时可以直接按两次 Tab 看结果:
zeroclaw <Tab><Tab>
zeroclaw completions <Tab>
Zsh 的推荐位置
Zsh 和 Bash 的命名习惯不一样。标准文件名通常是“下划线 + 命令名”:
~/.local/share/zsh/site-functions/_zeroclaw
也可以放到自定义目录,比如:
~/.zsh/completions/_zeroclaw
但前提是你要把这个目录加进 fpath。
Zsh 的基础配置
在 ~/.zshrc 中加入:
fpath=(~/.local/share/zsh/site-functions $fpath)
autoload -Uz compinit
compinit
然后生成补全文件:
mkdir -p ~/.local/share/zsh/site-functions
zeroclaw completions zsh > ~/.local/share/zsh/site-functions/_zeroclaw
重新打开终端或执行 exec zsh,通常就能生效。
命名规则别混
这部分最容易出错:
- Bash:文件名必须等于命令名,例如
zeroclaw - Zsh:推荐以下划线开头,例如
_zeroclaw
不要把 Bash 的命名方式拿去给 Zsh 用,也不要反过来。
一套够用的判断标准
如果你只是想判断“我现在这套做法是否合理”,可以用这几条:
- 是否放到了 shell 原生的补全目录中
- 文件名是否符合当前 shell 的约定
- shell 启动是否仍然足够快
- 新开终端后是否无需额外
source
只要这几项都满足,这套补全安装方式通常就已经够稳了。
一句话总结
补全脚本的最佳实践不是“能跑就行”,而是“长期用下来不添启动负担”。对 Bash 和 Zsh 来说,把脚本放到它们默认理解的位置,通常就是最省心的解法。