sudo: npm: 命令未找到。

367

我想升级到最新版本的node。我正在按照http://davidwalsh.name/upgrade-nodejs上的说明进行操作。

但是当我执行以下操作时:

sudo npm install -g n

我遇到了以下错误:

sudo: npm: command not found

npm无需使用sudo。当我执行以下操作时:

whereis node

我看到:

node: /usr/bin/node /usr/lib/node /usr/bin/X11/node /usr/local/node

运行中:

which npm

显示:

/usr/local/node/bin/npm

我尝试了https://dev59.com/hG445IYBdhLWcg3wOnrW#5062718上的解决方案,但是我仍然遇到同样的错误。我还查看了/etc/sudoers文件,相关行是:

Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

我认为这看起来很好。我该如何使用sudo命令使NPM工作?


6
这个命令可以吗?sudo /usr/bin/npm install -g n - robertklep
2
你可以尝试重新安装Node吗?听起来好像你删除了npm。 - Jeff Sloyer
1
你可能已经将/usr/local/node/bin添加到了 $PATH 中,但是 npm 应该安装在 /usr/local/bin中。第一个目录不在 secure_path 中,这就解释了为什么 sudo 找不到它。 - robertklep
8
在Ubuntu上使用nvm - 根据@robertklep的评论,我尝试了sudo/home/${user}/.nvm/version/node/${version}/bin/npm install,并且它起作用了。 - Stav Geffen
2
通过从以下软件包重新安装解决了我的问题。https://nodejs.org/en/download/ - Marghoob Suleman
显示剩余10条评论
31个回答

336

我必须去做

sudo apt-get install npm

这对我有用。


15
你表达的意思很难理解。 - tiny sunlight
6
这已经过时了。对我有用的是这些命令,我在这里找到了它们:https://github.com/nodesource/distributions#debinstall

在Ubuntu上使用

curl -sL https://deb.nodesource.com/setup_5.x | sudo -E bash - sudo apt-get install -y nodejs

在Debian上使用,作为root用户

curl -sL https://deb.nodesource.com/setup_5.x | bash - apt-get install -y nodejs
- Hamed
7
@tinysunlight,我不确定有什么不清楚的。原文作者表示 npm 命令不存在。这个命令用于安装 npm 命令。 - Velocibadgery
49
这不是问题的正确答案,因为从原帖可以明显看出npm已经安装,但在通过sudo调用时无法访问。该解决方案会重新安装已经存在的npm,这是在治标不治本。我理解这可能会修复一些人的损坏问题,但这是误导性的,就像现在这样。 - Dominic
10
当我在Ubuntu 18.10上使用NVM安装node时,sudo无法识别npm命令。对我来说,“sudo apt-get install npm” 起作用了。 - AlienKevin
显示剩余4条评论

176
npm文件应该在/usr/local/bin/npm。如果不在那里,请使用他们网站上的软件包重新安装node.js。我的情况就是这样解决的。

如果您在操作系统未安装的其他数据驱动器上安装了Node,则无法找到此路径。 - Hardik Darji
1
在Mac OS上使用Homebrew的情况下,需要执行两个步骤:(1) 确认Node的位置 (2) 确认npm的位置,它们应该都在/usr/local/bin目录下(这是Homebrew安装/链接node+npm的位置)。如果出现问题,请尝试以下解决方法:(1) 执行brew doctor命令 (2) 重新安装node。如果问题仍然存在,请检查您的路径(echo $PATH)。您可能有多个bin位置指向不同的node安装位置。如果是这种情况,请清理(使其更整洁)您的~/.bashrc / ~/.bash_profile文件,以便/usr/local/bin被正确加载,而不是指向随机的node安装位置。 - mirageglobe
9
这是一个部分解决方案。如果您手动安装node,可能会遇到问题。您必须将每个安装的二进制文件软链接到 /usr/bin 或 /usr/local/bin 中。将路径设置在 root 的 bashrc 中将不起作用,因为在使用 sudo 时不会读取该文件,因此这似乎是唯一的解决方法,除非您安装软件包。 - shrimpwagon
3
正如@shrimpwagon所说,手册说明的底部告诉你要链接以下命令:"sudo ln -s /usr/local/lib/nodejs/node-$VERSION-$DISTRO/bin/node /usr/bin/node sudo ln -s /usr/local/lib/nodejs/node-$VERSION-$DISTRO/bin/npm /usr/bin/npm sudo ln -s /usr/local/lib/nodejs/node-$VERSION-$DISTRO/bin/npx /usr/bin/npx"。 - James Nelson
2
为什么我要使用他们的网站? - user271832
从主网站获取并将其添加到PATH是处理此问题最简单的方法,apt中的npm版本已经过时(您可以在文件浏览器中在node文件夹前添加一个点来隐藏它)。 - younes zeboudj

137

对于MAC用户来说,下面这些步骤对我很有效。

如果你遇到Brew错误,请在终端中首先输入以下命令:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
然后运行以下命令:
$ brew update
$ brew uninstall node
$ brew install node
$ brew postinstall 

11
"brew uninstall node"这个命令对我无效,但我继续使用"brew install node"和"brew postinstall",问题得到了解决。谢谢。 - Trevor
6
brew postinstall 究竟是做什么的? - Oliver D
10
在Homebrew 2.2.14版本中,“brew postinstall”是多余的。 - Arslan Khan
在我的情况下,brew install node 无法覆盖旧版本的符号链接。我不得不运行 brew link --overwrite node 来解决这个问题。 - not2savvy

93

我遇到了相同的问题。以下是解决问题的命令:

  • sudo ln -s /usr/local/bin/node /usr/bin/node
  • sudo ln -s /usr/local/lib/node /usr/lib/node
  • sudo ln -s /usr/local/bin/npm /usr/bin/npm
  • sudo ln -s /usr/local/bin/node-waf /usr/bin/node-waf

3
在CentOS 7上对我起作用。 - hirikarate
8
对我来说,Ubuntu 16.04.1 LTS可行。我使用NVM,所以第一个路径是NVM安装node和npm的位置(路径包括版本%HOME%/.nvm/versions/node/v7.4.0/bin/npm)。不幸的是,由于路径中的版本号会更改,每次使用NVM更新时都必须参考这个答案。 - kas
1
这对我也解决了问题!最初发布在 Stack Overflow 上:在 EC2 上:sudo node 命令未找到,但不使用 sudo 的 node 可以正常工作 - Dominic
5
“@kas”,在您的bash配置文件中,可以添加以下内容:sudo ln -s $(whereis node) /usr/bin/node等等。 - Aravind Voggu
我更喜欢这种方式,而不是再次安装Node(我正在使用二进制文件)。 - Pratik Charwad
显示剩余4条评论

34

**编辑**

警告!- 执行chmod 777是一个相当激进的解决方案。首先尝试下面这些解决方案,逐个尝试,当其中一个起作用时停止:

  • $ sudo chmod -R 777 /usr/local/lib/node_modules/npm
  • $ sudo chmod -R 777 /usr/local/lib/node_modules
  • $ sudo chmod g+w /usr/local/lib
  • $ sudo chmod g+rwx /usr/local/lib

$ brew postinstall node是唯一可能会出现问题的安装部分。

Permission denied - /usr/local/lib/node_modules/npm/.github

所以我
// !! READ EDIT ABOVE BEFORE RUNNING THIS CODE !!
$ sudo chmod -R 777 /usr/local/lib
$ brew postinstall node

然后,npm现在已经被链接了

$ npm -v
3.10.10

额外信息

如果你在lib上使用了-R 777,我的建议是将嵌套的文件和目录设置为默认设置:

  • $ find /usr/local/lib -type f -print -exec chmod 644 {} \;
  • $ find /usr/local/lib -type d -print -exec chmod 755 {} \;
  • $ chmod /usr/local/lib 755

6
你刚才是不是建议将整个local/lib文件夹的权限都设为777? - sebastianf182
这个目录应该是什么 chmod 权限? - tim_xyz
1
@tim_xyz drwxr-xr-x 是 lib 的默认值。话虽如此,在将文件夹设置回来时,请勿使用递归功能 -R - Jacksonkr
谢谢!sudo chmod -R 777 /usr/local/lib/node_modules 对我有用。 - Hisagr
除非你有一个非常好的理由,否则永远不要使用 chmod 777 - Timothy Pulliam
@TimothyPulliam 您说得完全正确。我故意在答案顶部放置了警告,出于这个原因。 - Jacksonkr

23

我必须按照以下步骤进行操作:

  1. brew update
  2. brew uninstall node
  3. 访问https://nodejs.org/en/下载文件
  4. 安装下载好的文件

2
你是一个英雄。 - Abdulaziz Noor

15

如果您使用nvm安装了node/npm,则必须在使用这两个软件包之前运行nvm环境配置文件。

通常可以在~/.nvm/nvm.sh中找到该文件。

要自动运行此文件,请包含:

source ~/.nvm/nvm.sh

如果您想为您的用户使用sudo,请在用户的.bash_profile文件中包含-i参数以确保sudo设置用户环境。例如:

sudo -iu jenkins npm install grunt-cli

13

您可以创建符号链接并使其正常工作。

  1. 查找当前npm的路径

which npm

  1. 使用以下命令创建符号链接

sudo ln -s **which/npm** /usr/local/bin/npm

  1. 测试和验证

sudo npm -v


2
最简单的解决方案,对我非常有效,只需要在node上做同样的事情。 - Evgeny
@dipenparmar12 我也尝试了同样的方法,但现在我得到了“/usr/bin/env: ‘node’: 不是目录”的错误。 - Peter Nimmo
1
只有这个解决方案对我有效。 - dante velli
~/.nvm/versions/node/v14.19.1/bin/npm:没有该文件或目录。 - Marcie
~/.nvm/versions/node/v14.19.1/bin/npm:没有该文件或目录。 - undefined

11
为了使用sudo权限全局安装npm包,/usr/bin/npm 必须可用。如果 npm 存在于其他目录中,请创建软链接,例如:
sudo ln -s /usr/local/bin/npm /usr/bin/npm

它在Fedora 25、node8.0.0和npm5.0.0上运行良好。


简单而有效,在Linux Mint 20上对我起作用。 - avlnx
这应该是最好的答案!谢谢,伙计,它对我有用。 - Dilunga the Great
这在Ubuntu 22.04上运行正常。 - Mahesh Ghamaand

11
在 macOS 上,这对我有效:
brew reinstall node

2
抱歉刚注意到问题被标记为“unix”,但它仍然可能有所帮助,因为它是“macos npm命令未找到”的顶级Google搜索结果。 - friederbluemle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接