【问题标题】:Why do bash environment variables differ in shell versus node? [duplicate]为什么 bash 环境变量在 shell 和 node 中不同? [复制]
【发布时间】:2016-08-19 14:54:21
【问题描述】:

在 Bash 中运行这些命令:

  1. NODE_ENV=production echo $NODE_ENV 输出“”

  2. NODE_ENV=production && echo $NODE_ENV 输出“生产”

  3. export NODE_ENV=production && echo $NODE_ENV 输出“生产”

现在有一个文件 index.js:

console.log(process.env.NODE_ENV)

然后在 Bash 中运行这些命令:

  1. NODE_ENV=production node index.js 输出“生产”

  2. NODE_ENV=production && node index.js 输出“未定义”

  3. export NODE_ENV=production && node index.js 输出“生产”

我对这些命令感到困惑,为什么结果不同?

编辑:

谢谢大家。现在我给出我的解释,也许它对其他人有帮助。

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 fork 并在子进程中运行它,node 没有从父进程中获取$NODE_ENV

export NODE_ENV=production && node index.js, export 使变量可用于子进程,因此节点获得$NODE_ENV

【问题讨论】:

标签: node.js bash environment-variables


【解决方案1】:

先说几点:

  • && 是分隔两个命令的逻辑运算符(第二个命令仅在第一个命令成功时运行)

  • 对于var=value some_command,变量var被传递到some_command的环境中,只有在shell对some_command执行所有扩展之后

现在:

  • NODE_ENV=production echo $NODE_ENV:shell 首先运行echo $NODE_ENVNODE_ENV 在运行时未设置,因此输出为空白;变量NODE_ENV=production 只能像我之前所说的那样传递给扩展环境

  • NODE_ENV=production && echo $NODE_ENV 有两个命令;因为声明出现在第一个(并且成功),因此NODE_ENV 在第二个命令中将具有值production。请注意,变量NODE_ENV 不会被传递到第二个命令的扩展环境中。

  • export NODE_ENV=production && echo $NODE_ENV 与上述类似,事实上您通过exporting-ing 使NODE_ENV 在整个环境(所有子进程)中可用。因此,该变量将可用于扩展时的第二个命令及其环境。

类似的逻辑也适用于node 命令(以及所有其他类似情况)。

【讨论】:

  • 我不确定您的第一个要点是否完全准确。环境变量NODE_ENV 确实设置为productionecho 正在运行...只是该变量没有用于扩展其命令行,因此对输出没有有效影响。
  • ...当您有像 POSIXLY_CORRECT 这样的环境变量(对于某些实现)可以改变 echo 本身的行为方式时,这是相关的。
  • Charles,所以该命令存在于环境中,但它的使用取决于变量本身?
  • 我不确定您的评论到底是什么意思。如您所知,扩展参数发生在应用每个命令的环境变量之前——但这些变量仍然应用,并且某些值可以/将改变命令在运行时的行为方式。 (如果想使用确保不会改变命令行为的环境变量名,则保留至少一个小写字符的一组变量名)。
  • ...参见pubs.opengroup.org/onlinepubs/009695399/basedefs/… 了解建立该约定的标准文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-06
  • 2014-11-13
  • 1970-01-01
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多