为什么bash环境变量在shell与节点之间有所不同?

时间:2016-04-26 01:16:29

标签: node.js bash environment-variables

在Bash中运行这些命令:

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

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

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

  4. 现在有一个文件index.js:

    console.log(process.env.NODE_ENV)
    

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

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

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

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

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

      编辑:

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

      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.jsexport使变量可用于子流程,因此节点获取$NODE_ENV

1 个答案:

答案 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命令(以及所有其他类似的情况)。