sudo:节点:未找到命令

sudo:节点:未找到命令

我有一个与 nodejs 相关的问题。我这里有 nodejs 二进制文件:~/node-v8.5.0-linux-x64/并且我有一个使用以下方法创建的软链接:ln -s node-v8.5.0-linux-x64/ node

在我的 .bashrc 中,我有这个:export PATH=$PATH:$HOME/node/bin

node并且npm在我正常登录时运行良好。由于它们都安装在我家里,所以我不需要以 root 身份登录来全局安装软件包。

但我想尝试一下;所以我运行了:

sudo npm install -g angular-cli
sudo node app.js

但它不起作用。

sudo: node : command not found

我以为$PATH使用时可能会发生变化sudo但后来我使用以下命令进行了检查sudo echo $PATH

/home/dc/bin:/home/dc/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/dc/node/bin

当我输入命令时,shell 应该知道要去哪里node,但似乎不知道。我也尝试了和选项-H,但这些都无济于事。-i-usudo

有人能解释一下这里发生了什么吗?

答案1

不,sudo是的不是$PATH出于安全原因,请保留您的环境变量。相反,它将被替换为secure_path中定义的变量/etc/sudoers,您不应更改该变量。

$ sudo grep secure_path /etc/sudoers
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

您认为已经验证了变量是否$PATH与您的命令保持一致

sudo echo $PATH

但实际上,Bash 在开始执行任何(此处为sudo)命令之前会扩展变量,这意味着上面的行显示你自己的$PATH值。要获取sudo,请使用例如

sudo bash -c 'echo $PATH'

您可以做的是,例如,在您自己的用户的 shell 中使用以下进程替换来解析您想要运行的命令(node或) :npmwhich

sudo "$(which npm)" install -g angular-cli
sudo "$(which node)" app.js

这首先以您的用户身份运行which npmwhich node,返回属于指定命令的可执行文件的绝对路径。然后该输出实际上被插入到您的sudo命令中,因此sudo实际上相信它是使用如下所示的绝对路径执行的,无需在中查找任何内容$PATH

sudo /home/dc/node/bin/npm install -g angular-cli
sudo /home/dc/node/bin/node app.js

答案2

您可以在 /sbin 目录中为 node、npm 和 npx 创建软链接,例如

ln -s /usr/local/lib/nodejs/node-v12.14.1-linux-x64/bin/node /sbin/node

语法 >ln -s (source) (destination)

现在运行sudo node就可以了

相关内容