当前位置: 首页 > 知识库问答 >
问题:

node.js - linux 安装 nodejs,为什么环境变量 NODE_MAJOR 无法被填充?

许昆
2023-09-27

我按照这里的 https://github.com/nodesource/distributions 方式在 ubuntu22.04 上安装 nodejs 和 npm

图片.png

但是遇到了问题,当我执行下面的命令

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 是正常的

共有3个答案

闻深
2023-09-27

可能是因为 shell 认为这个NODE_MAJOR=18 echo "deb $NODE_MAJOR"命令是一条命令,执行这个命令的时候,NODE_MAJOR这个环境变量还不存在,所以是空的。

image.png

就是 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
image.png
image.png
可以看到 程序里面读取到了HHH这个环境变量,没有获取到参数,因为现在这个参数为空。
再次执行
image.png
这个时候结果是这样的:
image.png

就是在解析命令的时候,shell已经把当前的环境变量替换给echo了,echo拿到的就是“”,程序是能正常拿到环境变量的。


加了分号之后,分号之前的内容,相当于在当前会话设置了一个环境变量,分号之后是执行的另一个命令,这个分号其实和回车换行是一样的效果。

巩阳秋
2023-09-27
> 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
韦飞尘
2023-09-27

这个问题出现的原因可能是因为在执行命令时,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