我按照这里的 https://github.com/nodesource/distributions
方式在 ubuntu22.04
上安装 nodejs 和 npm
但是遇到了问题,当我执行下面的命令
NODE_MAJOR=18 echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
我发现 NODE_MAJOR 并没有填充
pon@T4GPU:~/code/me/reflex_example$ cat /etc/apt/sources.list.d/nodesource.listdeb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_.x nodistro main
可以看到,结果不是 https://deb.nodesource.com/node_18.x
而是 https://deb.nodesource.com/node_.x
我用的是 bash
为什么把 NODE_MAJOR=18 加在命令开头却不行,理论上,这也是一种正确传递环境变量的方式之一?
加个分号也可以, 但是在使用 python 的时候,是可以不加 ;
pon@T4GPU:~/code/me/reflex_example$ NODE_MAJOR=18; echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.listdeb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_18.x nodistro main
难道是因为,不加分号,只对该 shell 的子进程可见,shell 本身不可见?
比如我写一个 python 程序
main.py
import osprint(os.environ['RUN_MODE'])
然后调用
pon@T4GPU:~/code/me/reflex_example$ python main.py Traceback (most recent call last): File "/home/pon/code/me/reflex_example/main.py", line 2, in <module> print(os.environ['RUN_MODE']) ~~~~~~~~~~^^^^^^^^^^^^ File "<frozen os>", line 679, in __getitem__KeyError: 'RUN_MODE'pon@T4GPU:~/code/me/reflex_example$ RUN_MODE=prd python main.py prd
可以看到直接 python main.py
会报错,但是 RUN_MODE=prd python main.py
是正常的
可能是因为 shell 认为这个NODE_MAJOR=18 echo "deb $NODE_MAJOR"
命令是一条命令,执行这个命令的时候,NODE_MAJOR这个环境变量还不存在,所以是空的。
就是 shell 在解析命令的时候,在还没有执行 这行命令 的时候,就把当前这个shell的环境变量的值填充给了这个即将执行的命令了。在当前shell没有环境变量的时候,echo执行的就是 echo ''
。
用一个小程序来验证这个
这个程序执行后会打印环境变量和传入的参数。
package mainimport ( "fmt" "os")func main() { // 打印环境变量 fmt.Println("环境变量:") for _, env := range os.Environ() { fmt.Println(env) } // 检查是否传递了参数并打印参数 args := os.Args[1:] // os.Args[0] 是程序名称,从索引 1 开始是传递的参数 if len(args) > 0 { fmt.Println("传递的参数:") for _, arg := range args { fmt.Println(arg) } } else { fmt.Println("未传递任何参数。") }}
执行 HHH=123456 ./main $HHH
可以看到 程序里面读取到了HHH这个环境变量,没有获取到参数,因为现在这个参数为空。
再次执行
这个时候结果是这样的:
就是在解析命令的时候,shell已经把当前的环境变量替换给echo了,echo拿到的就是“”,程序是能正常拿到环境变量的。
加了分号之后,分号之前的内容,相当于在当前会话设置了一个环境变量,分号之后是执行的另一个命令,这个分号其实和回车换行是一样的效果。
> export NODE_MAJOR=18> echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
这个问题出现的原因可能是因为在执行命令时,NODE_MAJOR
环境变量的值并没有正确地传递到 echo
命令中。要解决这个问题,您可以直接在 echo
命令中使用变量,而不需要将其存储在单独的变量中。
以下是修正后的命令:
NODE_MAJOR=18 echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
在这个命令中,您可以直接使用 $NODE_MAJOR
来引用环境变量的值,而不需要将其存储在另一个变量中。通过这样的修改,您应该能够正确地填充 NODE_MAJOR
环境变量的值,并获得正确的源列表。
请注意,在执行这个命令之前,确保已经正确安装了 Node.js 和 npm,并且已经按照 https://github.com/nodesource/distributions
中的说明设置了 NODE_MAJOR
环境变量。
变量是计算机系统用于保存可变值的数据类型,我们可以直接通过变量名称来提取到对应的变量值。在 Linux 系统中,环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录(HOME)、邮件存放位置(MAIL)等。 值得一提的是,Linux 系统中环境变量的名称一般都是大写的,这是一种约定俗成的规范。 我们可以使用 env 命令来查看到 Linux 系统中所有的环境变量,执行命令如下: [r
问题内容: 如何在Windows中为Java(类路径)设置环境变量? 问题答案: 64位Windows 7或Windows 8上的Java SE Development Kit 8u112 设置以下用户环境变量(== 用户变量类型的环境变量) JAVA_HOME : C:\Program Files\Java\jdk1.8.0_112 JDK_HOME : %JAVA_HOME% JRE_HOME
问题内容: 我想通过运行程序时设置环境变量。这可能吗? 我试图这样设置: 但是结果消息说FOO不存在。 问题答案: 您必须传递一个包含键 env 的选项对象,该键 env 的值本身就是键值对的对象。
问题内容: Linux / Unix环境变量存放在哪里?如何不仅在当前运行的脚本中添加自己的环境变量并使之持久化? 问题答案: 您可以将它们添加到您的个人资料中,例如。全局配置文件通常位于/ etc中。例如。如果有的话,也看看目录。
本文向大家介绍Linux环境下nodejs的安装图文教程,包括了Linux环境下nodejs的安装图文教程的使用技巧和注意事项,需要的朋友参考一下 1、在官网下载nodejs,选择左边的。 2、选择文件右击点击extract here进行解压 3、进入bin目录,右击选择properties,解压文件可以随意放在系统里一个位置。复制location里的路径 4、添加路径 进入.bashrc文件,在
问题内容: 我正在将我的项目从单纯的转变为使用Grunt。 我曾经直接从webstorm运行我的应用程序,并且会为我设置环境变量。 如何在Grunt中实现相同目标? 我需要从webstorm(windows)运行grunt,或在运行grunt时设置环境变量(明确地) 部署时这不是问题,因为heroku已经负责设置我的环境变量。 问题答案: 使用grunt-env插件:https : //npmjs