我经常在node.js程序中看到这个命令:NODE_ENV=test node app.js
它将NODE_ENV变量设置为test and works。我也在这里阅读https://en.wikipedia.org/wiki/Environment_variable这应该适用于任何shell命令,但是我自己运行一些测试,这就是我所看到的
$ HELLO="WORLD"
$ HELLO="MARS" echo "$HELLO"
WORLD
$
我希望这会打印MARS
。我在这里缺少什么吗?
答案 0 :(得分:3)
语法VAR=value command
表示将在环境变量VAR
设置为VALUE
的情况下调用该命令,这仅适用于该命令的范围。
但是,当您使用命令行时:
HELLO="MARS" echo "$HELLO"
shell首先解释"$HELLO"
参数,确定它是WORLD
,然后运行它实际执行的操作:
HELLO="MARS" echo "WORLD"
所以回声可能会设置HELLO
变量,但它不会影响它打印的内容 - 它之前已被解释过。
否则
HELLO="MARS"; echo "$HELLO"
完全做了别的事情。首先,它在当前shell中将HELLO
设置为MARS
,然后继续解释echo
命令。到目前为止HELLO
包含MARS
,而不是WORLD
。但这是一个完全不同的效果 - 变量HELLO
保留值MARS
,而没有;
的命令就不是这样。
你的问题是echo
对于演示这个问题只是一个糟糕的选择。您可以进行其他演示以证明HELLO
已正确更改:
HELLO="MARS" eval 'echo $HELLO'
在这种情况下,shell不会解释$HELLO
,因为它在单引号的字符串中。它会首先将MARS
放入HELLO
,然后使用该变量集调用eval 'echo $HELLO'
。 eval
命令随后运行echo $HELLO
,您将获得您期望的输出。
这种语法最适用于那些不使用给定变量作为命令行一部分的东西,而是在内部使用它。
答案 1 :(得分:0)
其他答案是正确的,但这里有一个改进:
在bash中定义一个由空格分隔的变量列表时,实际上有两种情况,无论它是否以命令结束。
VAR1=value1 VAR2=value2 ... VARn=valuen command arg1 arg2 ... argn
和
VAR1=value1 VAR2=value2 ... VARn=valuen
不要以同样的方式导出VAR1 ...... VARn。
在第一种情况下,VAR1 ... VARn将仅为命令设置,然后不会导出到当前shell。
在第二种情况下,VAR1 ...... VARn将改变当前的shell。
然后(注意&#39 ;;'与使用新行完全相同)
HELLO=WORLD
HELLO=MARS echo "i don't export HELLO."
echo "HELLO=$HELLO"
将显示
i don't export HELLO.
HELLO=WORLD
和
HELLO=WORLD
HELLO=MARS ; echo "i did export HELLO."
echo "HELLO=$HELLO"
将显示
i did export HELLO.
HELLO=MARS