终端下命令缓存问题

macOS 系统自带的 rsync 版本比较老,所以使用 brew 安装了一个新版本。

但是,明明查看 $PATH 的列表,/opt/homebrew/bin 是在 /usr/bin 的前面,但是终端下使用 rsync --version 查看,版本没有改变。

不过在新的终端下,版本确实是更新。

使用为什么在 PATH 环境变量中,/opt/homebrew/bin在/usr/bin前面,但是使用的还是/usr/bin 中的 rsync?需要在新的 terminal 窗口才会正确?问了 Claude,告知 shell 会把命令的路径缓存在一个哈希表中,并且贴心的告知了解决步骤:

验证问题

# 查看当前使用的 rsync 路径
which rsync
# 可能显示:/usr/bin/rsync(旧的缓存)

# 查看 shell 的命令哈希表
hash -t rsync
# 或
type rsync

解决方法

hash -d rsync
# 或者
rehash # zsh
hash -r # bash,清除所有缓存

它除了告诉我 bash 下怎么处理,还给出了 zsh 的命令。
hashshell 内建的命令,在 bashzsh 中是不同的。zsh 中分成了三个命令:hashrehashunhash,而 bash 中只有一个命令,使用参数来控制。

最后,Claude 还告知我,要养成好的习惯:

预防措施

在安装新软件后,养成习惯:

# zsh
rehash

# bash
hash -r

# 或者直接
exec $SHELL # 重启当前 shell

在前 AI 时代,这个问题不得花个十几分钟找答案?于是我 Google 了一下上面的提示词,结果无论是 Google 列出的前几页网站还是 Google 网页上的 AI Overview,都没有给出正确的答案。 AI Overview 还是纠结在 .zshrc 中:

解决方法
检查当前 PATH: 在终端输入 echo $PATH,查看当前 PATH 变量的实际顺序。
确认配置文件:
Zsh (macOS 默认): 检查 ~/.zshrc。
Bash: 检查 ~/.bash_profile (登录时) 或 ~/.bashrc (交互式 shell)。
正确添加路径 (以 Zsh 为例):
打开 ~/.zshrc 文件。
确认有类似以下行(确保路径正确,且位置靠前):

不过使用 Gemini,倒是和 Claude 一样立刻判断除了问题所在。