如何为shell命令设置环境变量

时间:2015-01-22 19:41:38

标签: command-line sh

我经常在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。我在这里缺少什么吗?

2 个答案:

答案 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