我并不是在寻找解决方案(好吧,这也很方便)而主要是想解释为什么它在 Linux 中以这种方式工作。
OS: Ubuntu 22.04.1 (ubuntu-22.04.1-desktop-amd64.iso)
Node.js: installed through NVM, v16.18.0
我有一个简单的 shell 脚本:
测试文件
node --eval "console.log(123)"
sleep 2
如果我通过终端运行它:
- 在 Nautilius 或 Nemo 中的脚本目录背景上单击鼠标右键
- 点击
open terminal here
- 我们在终端的 shell 脚本文件夹中。现在输入命令
./test.sh
并按回车键
然后一切正常,节点被调用,我们看到123
输出,并且 2 秒后 shell 脚本由于节点调用后的睡眠命令而完成。
最令人吃惊的部分(我猜对我来说)是当我想以这种方式直接从 FileManager(系统默认的 Nautilius 或已安装的 Nemo)运行该 shell 脚本时:
- 右键单击
test.sh
文件并单击Run as a Program
其结果是终端显示错误:“节点:未找到”,并且 2 秒后由于sleep
命令而关闭。
为什么会有差异?第一次尝试时,终端可以看到 node.js,第二次尝试时终端看不到它。此外,如何修复它?
编辑:
我发现了一些,我之前通过终端安装了 NVM 以及一个 node.js 版本。但现在我又通过 GUI(Ubuntu 软件)安装了 Node.js,现在两种方式都可以使用。为什么?
为什么在终端中安装某些东西并不能使其在两种情况下都起作用?
答案1
问题是,通过 NVM 安装的 Node 不会出现在PATH
桌面环境使用的环境变量中,而只会出现在PATH
终端进程(提供 .bashrc 或类似文件)中使用的环境变量中。
这就是为什么终端进程可以node
正常找到,但Right单击 +“作为程序运行”不起作用的原因:“作为程序运行”选项只是从你的 DE 继承环境,而不是你~/.bashrc
自己的环境。
有关其工作原理的详细信息,请参阅这个Unix和Linux答案。显然,Ubuntu Software 安装 Node 的方式做出现在PATH
DE 使用的变量中。
链接的答案还提供了一种为整个 X 会话设置环境变量的方法,以便它们可供使用“作为程序运行”运行的程序使用(将它们放在中,或放在包含从和~/.xsession
中获取的环境变量的单独文件中)。~/.xsession
~/.bashrc