2016-04-26 44 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

    相關問題