我按照这里的 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.list
deb [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.list
deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_18.x nodistro main
难道是因为,不加分号,只对该 shell 的子进程可见,shell 本身不可见?
比如我写一个 python 程序
main.py
import os
print(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
是正常的
这里
$NODE_MAJOR
的替换是在当前的 bash 进程里完成的。而命令开始的MAJOR=18
只影响新启动的echo
进程。所以$NODE_MAJOR
是替换不了的。NODE_MAJOR=18; ...
里的NODE_MAJOR=18
是一个独立的赋值语句,他会影响当前 shell 的环境。在其之后执行的所有进程都可以看到NODE_MAJOR
的值。(上面
NODE_MAJOR=18 echo ...
的里NODE_MOJOR=18
是临时的,它只影响后面的echo
。)NODE_MOJOR=18 python ...
,这个例子里,python
进程已经可以看到NODE_MAJOR=18
的值了。所以其内部是可以用它做替换的。