MacOS Mojave中which命令失效问题排查求助
别担心,这不是你的系统设置出问题了——罪魁祸首是which命令的别名配置和MacOS自带的BSD版本which不兼容!
为什么会报错?
从你执行type --all which的结果能看到:
which is aliased to `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' which is /usr/bin/which
你的which被设置了一个别名,里面用到了--tty-only、--read-alias这类长选项,但MacOS Mojave自带的which是BSD版本的,它只支持短选项(比如-a、-s),完全不认识这些GNU风格的长选项,所以执行时就会抛出illegal option -- -的错误。
而type -all python的结果是正常的,它显示了你系统里存在的3个Python路径,这说明多版本Python的配置没有问题。
解决办法
1. 临时应急:绕过别名直接调用原始命令
如果只是想临时查询软件路径,直接用绝对路径调用BSD版which即可:
/usr/bin/which python
这样就不会触发别名里的错误参数,能正常返回结果。
2. 永久修复:二选一的方案
方案A:修改which的别名,适配BSD版本
编辑你的shell配置文件(比如~/.bash_profile或者~/.zshrc,取决于你用的是Bash还是Zsh),找到定义which别名的行,把它改成BSDwhich支持的格式。比如改成显示所有匹配路径的版本:
alias which='/usr/bin/which -a'
保存文件后,执行source ~/.bash_profile(或对应的配置文件)让修改生效,之后再用which python就正常了。
方案B:安装GNU版本的which(推荐给需要长选项的用户)
如果你依赖别名里的那些长选项功能,可以通过Homebrew安装GNU版本的which,它完全支持这些参数:
brew install which
安装完成后,GNU版which会被放在/usr/local/bin/which(Intel Mac)或/opt/homebrew/bin/which(Apple Silicon Mac),系统会优先使用这个版本,原来的别名就能正常工作了。
内容的提问来源于stack exchange,提问作者Kid

