如何修复 bash 在错误的目录中查找程序的问题(在 Ubuntu 11.10 上设置 NPM 的问题)

Ste*_* Lu 5 shell bash path

这次我curl http://npmjs.org/install.sh | sudo sh从 dir运行了“信任”安装脚本/

$ which npm
/usr/local/bin/npm
$ npm
bash: /home/steven/local/bin/npm: No such file or directory
$ echo $PATH
/home/steven/local/bin:/home/steven/local/bin:/home/steven/local/bin:/home/steven/local/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
$ ls /home/steven/local/bin
node  node-waf
$ ls /usr/local/bin
node  node-waf  npm  npm_g  npm-g
Run Code Online (Sandbox Code Playgroud)

似乎某个地方的某个脚本正在污染我的$PATH. 我想知道的是,如果bash在它查找的第一个目录中找不到该程序,它不是一直在查看$PATH吗?应该可以在里面找到/usr/local/bin

npm真的,真的似乎不想只是工作。我想我要去加载一个稍微旧的 Ubuntu 并再试一次......

Gil*_*il' 7

很有可能你确实有一个/usr/local/bin/npm并且你的外壳在它的缓存中记住了它。您可以清除缓存hash -d npm。缓存不在 shell 实例中共享,因此问题不会持续。

的输出which与您的 shell 所做的不一致的原因是它which是一个外部程序,因此它不共享 bash 的缓存。改用type它,它是一个内置的外壳,因此更可靠。


roz*_*acz 2

您可以认为自己相当幸运,因为您刚刚学会了简单的方法,即不应将附加的二进制目录放在PATH变量前面。在你的情况下,一个理智的PATH变量应该看起来像

PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/steven/local/bin:/home/steven/local/bin:/home/steven/local/bin:/home/steven/local/bin

但实际上导致错误的问题并不是真正的PATH,而是可能被别名为 的命令npm。要了解这一点,请输入

type npm
Run Code Online (Sandbox Code Playgroud)

另一种选择可能是这/usr/local/bin/npm只是一个损坏的符号链接/home/steven/local/bin/npm(但您也可以通过上面的命令了解到这一点)。