为什么`which -a`没有列出实际会执行的可执行文件?
你遇到的问题本质是which工具的能力边界和Shell命令执行优先级的差异导致的:
which本身是独立的外部可执行工具,它的工作逻辑就是只扫描PATH环境变量中匹配的外部可执行文件,完全不感知当前Shell会话中定义的别名(alias)、自定义Shell函数、Shell内置命令。- 而Shell执行命令的优先级是:别名 > 自定义Shell函数 > Shell内置命令 > PATH下的外部可执行文件。优先级高的匹配项会被优先调用,不会再找优先级更低的外部可执行文件。
你这里执行speedtest -V返回curl版本,说明speedtest已经被定义为指向curl的别名,比如你可能之前执行过alias speedtest='curl --speed-test'或者配置文件里写了对应的别名规则,这个别名优先级远高于/usr/local/bin下的speedtest可执行文件,所以会被优先调用。
验证方法
执行以下命令即可看到speedtest对应的所有命令定义,按执行优先级从高到低排序:
type -a speedtest
如果确实是别名导致的,输出第一行就会显示speedtest is aliased to 'curl xxx'。
解决方法
- 临时取消本次会话的别名:执行
unalias speedtest,之后再调用speedtest就会执行/usr/local/bin下的Ookla官方工具。 - 永久取消:打开你当前使用的Bash配置文件(通常是
~/.bashrc或者~/.bash_profile),删除其中alias speedtest=xxx的行,重启Shell即可生效。
补充说明
你遇到的whereis speedtest无输出属于macOS平台的正常现象:macOS系统自带的whereis工具默认只扫描系统预置的标准路径,不会读取当前用户的PATH配置,所以找不到brew安装在/usr/local/bin下的第三方工具。
内容的提问来源于stack exchange,提问作者orome
相关产品推荐
相关产品推荐

