补充说明
hash 是 bash 的内建命令,用来查看和操作命令查找缓存。bash 第一次执行某个命令时会在 PATH 中搜索并记住其完整路径,后续调用直接命中缓存,省去重复查找。这个缓存就是 hash 表。
当你在当前会话中安装了新程序、移动了二进制文件或修改了 PATH,缓存可能仍指向旧路径,表现为“命令找不到”或执行了错误版本。此时用 hash -r 清空缓存即可,这也是最常见的用法。
注意:hash 只影响当前 shell 进程及其子 shell 的继承状态,不会改变系统范围;脚本中通常不需要关心它,因为非交互 shell 默认不启用或很快退出。command -v、type -a 用于查询,不会像 hash 那样维护缓存表。
语法
hash [-lr] [-p 路径] [-dt] [命令名...]
选项
- 无参数:打印当前哈希表
-r:清空整个哈希表-l:以可重新输入的格式列出,如builtin hash -p /usr/bin/ls ls-t 名称:显示某命令缓存的路径-p 路径 名称:手工把名称映射到指定路径-d 名称:删除某个命令的缓存项-d(无参数):同-r,清空
实例
# 查看当前缓存
hash
# 查询 ls 的缓存路径
hash -t ls
# 修改 PATH 或安装新命令后刷新缓存
hash -r
# 以可复现的格式导出缓存
hash -l
# 手工指定命令路径(临时覆盖 PATH 查找)
hash -p /opt/app/bin/tool tool
# 删除单个缓存项
hash -d git
# 验证命令实际解析位置
type -a python3
command -v python3
交互式 shell 中的 hash 表会随命令执行自动增长。若发现 bash: /usr/bin/foo: No such file or directory,优先尝试 hash -r,再检查 PATH 与文件是否真实存在。