Node.js 为什么bash环境变量在shell和节点中有所不同?
在Bash中运行以下命令:Node.js 为什么bash环境变量在shell和节点中有所不同?,node.js,bash,environment-variables,Node.js,Bash,Environment Variables,在Bash中运行以下命令: NODE_ENV=production echo$NODE_ENVoutputs“” 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_ENV=production echo$NODE_ENV
outputs“”NODE_ENV=production&&echo$NODE_ENV
输出“production”export NODE_ENV=production&&echo$NODE_ENV
输出“production”console.log(process.env.NODE_ENV)
然后在Bash中运行以下命令:
NODE_ENV=production NODE index.js
输出“生产”NODE\u 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\u ENV
NODE_ENV=production NODE index.js
,在命令前面加上变量定义,使此变量可用于此命令
NODE_ENV=production&&NODE index.js
,NODE是一个外部命令,Bash将其分叉并在子进程中运行,NODE不从父进程获取$NODE_ENV
export NODE_ENV=production&&NODE index.js
,export
使变量可用于子流程,因此NODE首先获得$NODE_ENV
几点:
是一个逻辑运算符,用于分隔两个命令(第二个命令仅在第一个命令成功时运行)&&
- 对于
,只有在shell对var=value some_command
执行所有扩展之后,变量some_command
才会传递给var
的环境some_command
:shell首先运行NODE_ENV=production echo$NODE_ENV
,并且echo$NODE_ENV
在运行时未设置,因此输出为空;变量NODE_ENV
只能像我前面所说的那样传递到扩展环境NODE\u ENV=production
有两个命令;由于声明在第一个命令中出现(并成功),因此NODE_ENV=production&&echo$NODE_ENV
将在第二个命令中具有值NODE_ENV
。请注意,变量production
不会传递到第二个命令的扩展环境NODE_ENV
与上述类似,您通过export NODE_ENV=production&&echo$NODE_ENV
-ing使export
在整个环境(所有子流程)中可用。因此,变量将在展开时间内可用于第二个命令,也可用于其环境NODE_ENV
节点
命令(以及所有其他类似情况)。首先有几点:
是一个逻辑运算符,用于分隔两个命令(第二个命令仅在第一个命令成功时运行)&&
- 对于
,只有在shell对var=value some_command
执行所有扩展之后,变量some_command
才会传递给var
的环境some_command
:shell首先运行NODE_ENV=production echo$NODE_ENV
,并且echo$NODE_ENV
在运行时未设置,因此输出为空;变量NODE_ENV
只能像我前面所说的那样传递到扩展环境NODE\u ENV=production
有两个命令;由于声明在第一个命令中出现(并成功),因此NODE_ENV=production&&echo$NODE_ENV
将在第二个命令中具有值NODE_ENV
。请注意,变量production
不会传递到第二个命令的扩展环境NODE_ENV
与上述类似,您通过export NODE_ENV=production&&echo$NODE_ENV
-ing使export
在整个环境(所有子流程)中可用。因此,变量将在展开时间内可用于第二个命令,也可用于其环境NODE_ENV
类似的逻辑也适用于
节点
命令(以及所有其他类似情况)。相关:相关:我不确定您的第一个要点是否完全准确。当echo
运行时,环境变量NODE\u ENV
确实设置为production
。。。只是该变量没有用于扩展其命令行,因此对输出没有有效的影响……当您有环境变量(如POSIXLY_CORRECT
)时,这一点很重要,因为(对于某些实现)可以改变echo
本身的行为。Charles,因此,该命令存在于环境中,但其使用取决于变量本身?我不确定您所说的注释的确切含义。如您所知,扩展参数是在应用每命令环境变量之前进行的,但这些变量仍然被应用,并且一些值可以/将改变命令在运行时的行为。(如果希望使用确保不会改变命令行为的环境变量名,则至少保留一个小写字符的变量名集用于此目的)…请参阅建立该约定的标准文档。我不确定您的第一个要点是否完全准确。环境