Node.js与Ubuntu 12.04上的Node有何区别?

390

我按照这里的说明在Ubuntu上安装了nodejs。

当我在终端中输入node --version时,看到以下信息:
-bash: /usr/sbin/node: 没有那个文件或目录

但是,我可以在/usr/sbin/目录下看到node。

输入npm --version显示1.3.5
输入nodejs --version显示v0.10.15

此外,我也可以在/usr/bin/目录看到node。

那么,我该如何让node正常工作呢?

此外,如果我使用zsh而不是bash,则node命令可以正常工作。


1
如果“你在/usr/bin/中看到了node”,那么ls -l /usr/bin/node的输出是什么? - randunel
1
@randunel 我得到了这个输出 lrwxrwxrwx 1 root root 22 Jan 1 2013 /usr/bin/node -> /etc/alternatives/node - Jatin
抱歉,我对这个输出感兴趣:declare -x PATH=".....,而不是 NODE_PATH,只是 PATH - randunel
路径看起来没问题,你应该可以从任何地方看到 node 可执行文件。当你输入 whereis node,输出是什么? - randunel
1
请在此处查看解决方案和说明:https://dev59.com/7WEi5IYBdhLWcg3wjs1j#21171188 - throbi
显示剩余7条评论
22个回答

613

您需要手动创建符号链接 /usr/bin/node。适用于 bash 兼容的 shell 的快捷方式:

sudo ln -s `which nodejs` /usr/bin/node

或者如果您使用非标准的shell,只需硬编码使用which nodejs找到的路径:

sudo ln -s /usr/bin/nodejs /usr/bin/node

后来的编辑

我在您发布的链接中找到了这个解释:

node包(业余分组无线电节点程序)存在命名冲突,因此nodejs二进制文件已从node重命名为nodejs。您需要将/usr/bin/node建立符号链接到/usr/bin/nodejs,或者卸载业余分组无线电节点程序以避免该冲突。

再次后来的编辑

我回答这个问题已经有一段时间了。尽管我发布的解决方案对我多次有效,但用户在评论中报告了更多的解决方案:

来自@user229115:

sudo update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10

来自AskUbuntu(用户leftium)

sudo apt-get --purge remove node
sudo apt-get --purge remove nodejs
sudo apt-get install nodejs

好的!虽然,如果我使用 zsh,那么 node 命令就可以工作。 - Jatin
2
另外,我如何卸载Amateur Packet Radio Node程序?我尝试了sudo apt-get remove node,但它显示“Package node is not installed, so not removed”。 - Jatin
您不需要卸载它,在您的评论之后,这看起来像是一个shell问题,而不是一个node包问题。 - randunel
我需要在 sbin 中创建符号链接$ sudo ln -s /usr/bin/nodejs /usr/sbin/node - David Martines
2
@Tino的答案是正确的,可以查看nodejs-legacy软件包的描述。同时,@BennyMcBenBen链接的答案也已经更新了类似的说明。 - tricasse
显示剩余5条评论

90
我认为这就是:
sudo update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10
使用Debian alternatives。

3
这似乎比被接受的答案更好,因为它不手动更改 /usr/bin/ 文件夹,并使用基础设施来替换命令。 - Dominik Fretz
没试过,但我看了update-alternative的文档。如果它真的有效,那么它是一个更好的解决方案 :) - randunel
3
你能更具体地说明这个正在做什么吗? - bcorso
2
我必须执行 source ~/.bashrc 才能使其生效。 - iNulty
这是一种更加清晰和自我解释的方法。在2016年的Ubuntu 16.04、node v7.3.0和npm v4.6.1上仍然有效。永远不要从Ubuntu默认的存储库安装nodejs!感谢@user229115提供的精彩答案。 - InamTaj
显示剩余3条评论

68

显然解决方案在Ubuntu版本之间有所不同。以下是我在Ubuntu 13.10上使用的解决方法:

sudo apt-get install nodejs-legacy

HTH

编辑:经验法则:

如果你已经安装了nodejs但是缺少/usr/bin/node二进制文件,则还需要安装nodejs-legacy这只是创建了缺失的符号链接。

根据我的测试,Ubuntu 17.10及以上版本在安装 nodejs 后已经放置了兼容性软链接 /usr/bin/node ,因此这些版本不再需要 nodejs-legacy


似乎nodejs-legacy不再维护了。最新版本的构建停留在2013年4月10日。 - francoisrv
8
nodejs-legacy 不需要太多维护。它只是在LTS 14.04上添加了一个类似于 sudo ln -s nodejs /usr/bin/node 的软链接。 - Tino
4
在 Ubuntu 14.04 上,nodejs 和 nodejs-legacy 安装相同版本的 Node(0.10.25)。+1 给 @Tino。 - Mark E. Haase
在Debian Jessie中对我有效。这应该是被接受的答案,因为这就是事情的本意。只有使用业余无线电包的人不应该这样做。我想知道他们为什么没有像chromium-bsu一样重命名无线电包。 - Jérôme
这将在您的系统上导致2个Node实例,而且它已不再维护...建议您链接到nodejs。 - PodTech.io
@Hariboo(我的答案中添加了经验法则。)我尝试过Ubuntu 13.10、14.04和16.04。nodejs-legacy不会安装第二个软件包,它只是创建了一个指向/usr/bin/nodejs/usr/bin/node软链接。没有太多需要“维护”软链接,因此可以将其“取消维护”。nodejs-legacy在Ubuntu 17.10以及即将推出的Ubuntu 18.04中也缺失,因为nodejs现在包括了之前在nodejs-legacy中的软链接,所以不再需要nodejs-legacy - Tino

30

我在Ubuntu 14.04中遇到同样的问题。

我已经安装了"nodejs",并且它可以正常工作,但只有当我使用命令"nodejs"时才能工作。如果我尝试使用"node",则没有任何反应。

我通过以下方式解决了这个问题:

  1. 安装nodejs-legacy

    sudo apt-get install nodejs-legacy

之后,在命令行中键入"node"会收到一个错误消息"/usr/sbin/node: No such file or directory"

  1. 第二步,我创建了一个符号链接指向"nodejs":

    sudo ln -s /usr/bin/nodejs /usr/sbin/node

4
你的系统有一些奇怪的地方。 node 应该被安装在 /usr/bin/ 而不是 /usr/sbin/。看起来你之前从 hamradio 安装了 Ubuntu 的 node 包(详见 http://packages.ubuntu.com/trusty/all/node/filelist),但忘记在 shell 级别上运行 hash -r 命令,因此 shell 仍然记住了错误的路径。第二个 ln 命令修复了这个问题,但是当你退出该 shell 后就不再需要了。 - Tino
顺便说一句,即使是错误的答案也可以解释所有的麻烦,因为有三个非常相似名称的软件包:node(用于完全不同的东西的/usr/sbin/node),nodejs/usr/bin/nodejs)和nodejs-legacy/usr/bin/node,取决于nodejs软件包)。 - Tino
这也发生在我身上。我之前安装了一段时间的源代码节点。node -v => 0.10.2,而nodejs -v => 5.5.0。运行命令which node总是指向本地安装。最后,我不得不unset NODE_PATH,它指向本地安装以解决问题。此后,node -v => 5.5.0npm install开始为依赖于Node => 5.0的软件包工作。 - CHsurfer

12

Node Version Manager (nvm)

如果你想要安装多个nodejs版本并轻松地在它们之间切换,我建议使用Node Version Manger。它还解决了命名问题(node vs nodejs

使用方法非常简单:

安装nodejs版本:

$ nvm install 4.4

现在你已经有了 Node.js 4.4 版本,除了已经安装的那个版本之外,你可以使用 node 命令来访问新安装的版本:

$ node -v    // The new version added by nvm.
v4.4.5
$ nodejs -v  // The OS version is untouched and still available.
v0.10.25

您可以安装更多的Node.js版本,并轻松地在它们之间切换:

$ nvm install 6.2
$ nvm use 6.2
Now using node v6.2.1 (npm v3.9.3)
$ node -v
v6.2.1
$ nvm use 4.4
Now using node v4.4.5 (npm v2.15.5)

2
问题已经解决了,非常感谢。我在《如何在Ubuntu 14.04服务器上安装Node.js》(https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-an-ubuntu-14-04-server)中找到了一些有用的`nvm`命令。 - Huy Nguyen
1
这对我有用。此外,这里有一份指南:https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-an-ubuntu-14-04-server#how-to-install-using-nvm - Koen Cornelis

11

这也发生在我身上了。

node -v => 0.10.2
nodejs -v => 5.5.0

问题在于我之前安装了Node.js的源代码版本。运行

which node

始终指向此本地安装。此外,

echo NODE_PATH

指向本地安装。

删除源代码安装的目录并没有帮助,反而破坏了 node 命令。最终,取消 NODE_PATH 环境变量设置并清除再重新安装 nodejs 解决了问题。

unset NODE_PATH
sudo apt-get --purge remove nodejs
sudo apt-get install nodejs

之后,

node -v => 5.5.0

现在npm install可以用于依赖于Node=>5.0的软件包。


这对我有用。太糟糕了,我在找到它之前乱搞了一个小时。 - Dustin Fraker

10

我对这一切都很陌生,但对我来说一个简单的别名起作用:

alias node='env NODE_NO_READLINE=1 rlwrap nodejs'

至少用于在bash中直接运行东西和执行.js文件。


没有使用 rlwrap 工作。谢谢! - Alex Barkun
谢谢@Phill,你太棒了! - Yusril Herlian Syah

9

使用Node.js官方网站提供的官方指南如何呢:

对于v7:

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

对于v6版本:

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

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

我已经在Windows bash(通过子系统Linux-14.04)和基于ARM Debian的raspbian上进行了测试。如果您在先不运行设置脚本的情况下运行sudo apt-get install -y nodejs,则会得到node 0.10版本。如果您计划安装需要构建的本机npm模块,请同时运行以下命令:
sudo apt install -y build-essential

注意:这是所有架构中基于Debian的发行版推荐的路径。


7
这对我有用:
alias node=nodejs

在按照此链接中的说明操作后。

7

在@randunel正确的答案中(目前无法在SO上发表评论),还需要补充:

我也必须将/usr/local/bin/node符号链接到/usr/bin/nodejs。

sudo ln -s /usr/bin/nodejs /usr/local/bin/node

显然,这个设置覆盖了/usr/bin/node命令。

不知道它是怎么被设置的,但希望它能帮助其他人,因为弄清楚为什么上述内容对我不起作用真是一件痛苦的事情。


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