Node.js 为什么bash环境变量在shell和节点中有所不同?

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

在Bash中运行以下命令:

  • NODE_ENV=production echo$NODE_ENV
    outputs“”

  • 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
    输出“生产”

  • 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
    几点:

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

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

    现在:

    • NODE_ENV=production echo$NODE_ENV
      :shell首先运行
      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
      与上述类似,您通过
      export
      -ing使
      NODE_ENV
      在整个环境(所有子流程)中可用。因此,变量将在展开时间内可用于第二个命令,也可用于其环境

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

    首先有几点:

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

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

    现在:

    • NODE_ENV=production echo$NODE_ENV
      :shell首先运行
      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
      与上述类似,您通过
      export
      -ing使
      NODE_ENV
      在整个环境(所有子流程)中可用。因此,变量将在展开时间内可用于第二个命令,也可用于其环境


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

    相关:相关:我不确定您的第一个要点是否完全准确。当
    echo
    运行时,环境变量
    NODE\u ENV
    确实设置为
    production
    。。。只是该变量没有用于扩展其命令行,因此对输出没有有效的影响……当您有环境变量(如
    POSIXLY_CORRECT
    )时,这一点很重要,因为(对于某些实现)可以改变
    echo
    本身的行为。Charles,因此,该命令存在于环境中,但其使用取决于变量本身?我不确定您所说的注释的确切含义。如您所知,扩展参数是在应用每命令环境变量之前进行的,但这些变量仍然被应用,并且一些值可以/将改变命令在运行时的行为。(如果希望使用确保不会改变命令行为的环境变量名,则至少保留一个小写字符的变量名集用于此目的)…请参阅建立该约定的标准文档。我不确定您的第一个要点是否完全准确。环境