2016-04-26 99 views
0

在击运行这些命令:为什么bash环境变量在shell与node中有所不同?

  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) 

然后在击运行这些命令:

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

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

  • 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,节点是一个外部命令,Bash分叉并在子进程中运行它,节点不从父进程得到$NODE_ENV

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

    +1

    相关:[在命令行上指定回声的环境变量?](http://stackoverflow.com/questions/10938483/bash-specifying-environment-variables-for-echo-on-command-line) –

    回答

    2

    几点第一:

    • &&是分隔两个命令的逻辑运算符(第二个运行只有当第一个成功)

    • 对于var=value some_command,可变var被传递到some_command的环境,仅在外壳执行所有扩展后some_command

    现在:

    • NODE_ENV=production echo $NODE_ENV:壳运行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就像上面那样,您在012xx-ing中可以在整个环境(所有子过程)中使用NODE_ENV。因此,该变量将在扩展时间内以及其环境中可用于第二个命令。

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

    +0

    I'米不确定你的第一个要点是完全准确的。环境变量'NODE_ENV'在'echo'运行时确实被设置为'production' ......只是这个变量不用于扩展它的命令行,所以对输出没有有效的影响。 –

    +0

    ...当你有像'POSIXLY_CORRECT'这样的环境变量(对于某些实现)可以改变'echo'本身的行为方式时,这是恰当的。 –

    +0

    Charles,所以命令存在于环境中,但其用法取决于变量本身? – heemayl

    相关问题