在Bash中运行这些命令:
NODE_ENV=production echo $NODE_ENV
输出“”
NODE_ENV=production && echo $NODE_ENV
输出“production”
export NODE_ENV=production && echo $NODE_ENV
输出“production”
现在有一个文件index.js:
console.log(process.env.NODE_ENV)
然后在Bash中运行这些命令:
NODE_ENV=production node index.js
输出“production”
NODE_ENV=production && node index.js
输出“未定义”
export NODE_ENV=production && node index.js
输出“production”
我对这些命令感到困惑,为什么结果不同?
编辑:
谢谢大家。现在我给出解释,也许这对其他人有帮助。
NODE_ENV=production echo $NODE_ENV
,Bash在运行此命令之前花费$NODE_ENV
,此时$NODE_ENV
未设置,因此结果为空。
NODE_ENV=production && echo $NODE_ENV
,这是两个命令,第二个命令命令仅在第一个命令成功时运行。在运行第二个命令之前,Bash会消耗此时设置的$NODE_ENV
。
NODE_ENV=production node index.js
,将变量定义添加到命令前面使该变量可用于此命令。
NODE_ENV=production && node index.js
,node是一个外部命令,Bash分叉它并在子进程中运行它,节点不会从父进程获得$NODE_ENV
。
export NODE_ENV=production && node index.js
,export
使变量可用于子流程,因此节点获取$NODE_ENV
。
答案 0 :(得分:2)
首先几点:
&&
是一个逻辑运算符,用于分隔两个命令(第二个命令仅在第一个命令成功时运行)
对于var=value some_command
,变量var
仅在shell执行some_command
some_command
的环境现在:
NODE_ENV=production echo $NODE_ENV
:shell首先运行echo $NODE_ENV
并且NODE_ENV
在运行时未设置,因此输出为空;变量NODE_ENV=production
只能像我之前告诉的那样传递给扩展环境
NODE_ENV=production && echo $NODE_ENV
有两个命令;因为声明来自第一个(并且成功),因此NODE_ENV
将在第二个命令中具有值production
。请注意,变量NODE_ENV
不会传递给第二个命令的扩展环境。
export NODE_ENV=production && echo $NODE_ENV
与上述类似,事实上您通过NODE_ENV
- 在整个环境(所有子流程)中提供exporting
。因此,变量将在扩展时间以及其环境中可用于第二个命令。
类似的逻辑也适用于node
命令(以及所有其他类似的情况)。