我有一个与 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
-u
sudo
有人能解释一下这里发生了什么吗?
答案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
或) :npm
which
sudo "$(which npm)" install -g angular-cli
sudo "$(which node)" app.js
这首先以您的用户身份运行which npm
或which 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
就可以了