哪个命令在我的电脑上不起作用

which command doesn't work on my computer

以前我们都是通过'which'命令获取电脑上相关软件的信息,比如:

which python
which git 

但现在它似乎不适用于我的 MacOS Mojave。我的设置有问题吗?

新版本: 结果会变成这样

AA:~ AA$ which python
/usr/bin/which: illegal option -- -
usage: which [-as] program ...

新版本2:

AA:~ AA$ type --all which
which is aliased to `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
which is /usr/bin/which

AA:~ AA$ type -all python
python is /Users/AA/anaconda3/bin/python
python is /Users/AA/anaconda/bin/python
python is /usr/bin/python
AA:~ AA$

别名是导致错误消息的原因。显然,别名定义对于您的系统来说是错误的。目前尚不清楚是什么定义了这个别名或为什么;它在几个层面上似乎是错误的,所以我怀疑它是标准安装的一部分。

您可以使用 unalias which 删除别名;但我猜它是在你的一个启动文件中定义的,应该从那里删除 - 在这一点之后,它应该在你下次登录时永远消失。

但无论如何,您不应该使用 which - 最好让自己习惯 POSIX 标准命令 type。它是专门为取代 which 而引入的,但显然仍然很难从人们的脑海中根除旧命令。

对我来说,这是 yarn global upgrade 中的东西取代了我系统中的 /usr/bin/which

/usr/bin/which -> ../local/share/.config/yarn/global/node_modules/.bin/which

由于您的错误消息与该程序中的文本字符串完全相同,因此您的问题可能来自类似的来源。

console.error('which: illegal option -- ' + flag)
console.error('usage: which [-as] program ...')

“已修复”通过系统的包管理器重新安装 which(例如 sudo dnf reinstall which)。这现在可能会干扰依赖它的任何 JavaScript 包,但我计划删除这些全局变量,所以我不会发现。

更好的解决方法: 我觉得我的系统现在很脏,需要检查它的所有 bin 文件...比较 /usr/local/share/.config/yarn/global/node_modules/.bin 中的所有内容,看看它是否有/usr/bin 中的等价物似乎是寻找其他干扰点的一种足够简单的方法。

for x in $(ls /usr/local/share/.config/yarn/global/node_modules/.bin/*); do
    ls -l /usr/bin/"$(basename "${x}")"
done

然后可以使用如下命令对照系统的包管理器检查这些。然后根据需要重新安装。

sudo dnf info ...
sudo dnf provides ...

更多:

我觉得它会破坏现有的系统程序,这让我觉得很奇怪。至少,我希望它使用 /usr/local/bin 代替。那个额外的系统和 system-like 包管理似乎是 why they have done away with yarn global in yarn 2 (berry).

我有 sudo yarn global listyarn global list 的不同包。也许在某些时候使用 sudo 是我的错误?


P.S。感谢 @tripleee,我不知道 type。我已经看到了尝试处理不同 which 程序和不同版本 which 的各种其他方法,以及 test 等替代方法(以及我忘记的其他方法),但是 type看起来值得尝试作为替代品。

P.P.S。烦人地发现这个 OS 被配置为 运行 制表符完成,通过它。

P.P.P.S。是的,我知道使用输出 ls 编写脚本是一个坏习惯。