如何在bash中启动带有多个环境变量设置的命令

6

只需设置一个环境变量,如下所示:

bash$> foo=1 echo "$foo"
1

[编辑:如下所述,即使如此,也不起作用,但只有因为$foo之前由某些其他试验设置过。应在试验之间给出“unset foo”。]

但是,如果需要在启动命令的同一条命令行中设置多个环境变量呢? 这些不起作用:

bash$> foo=1 bar=2 echo "$foo $bar"
1

bash$> foo=1 && bar=2 echo "$foo $bar"
1

bash$> (foo=1;foo=2) && echo "$foo $bar"
1 

bash$> (foo=1 && foo=2) && echo "$foo $bar"
1 

这是可能的吗?(使用脚本很明显可以实现)


1
实际上,即使是你的第一个例子(foo=1 echo "$foo")也不起作用,你可能只是从之前的运行中设置了 foo - IMSoP
啊,你说得对。我应该在尝试之间使用“unset foo”。 - zimon
2个回答

7
我假设您不希望这些环境变量在当前shell中设置,以便后续命令不会受到这些环境变量的影响。那么这个怎么样:
$ foo=1 bar=2 bash -c 'echo $foo - $bar '
1 - 2

$ echo $foo
<no output>

$ echo $bar
<no output>

请注意,环境变量的范围仅限于bash子shell。如下两个命令所示,这些环境变量没有出现在当前shell中。
如果您不关心环境变量是否出现在当前shell中,则以下内容就足够了。
$  foo=1; bar=2; echo "$foo $bar"
1 2

$  echo $foo - $bar
1 - 2

你实际上不需要在这里使用env;正如我在作为重复的问题提出的问题中指出的那样,关键在于$foo被放在单引号中,并且稍后由bash -c评估。因此,foo = 1 bar = 2 bash -c'echo $ foo- $ bar'同样可以正常工作,就像foo=1 bar=2 some_other_command一样。 - IMSoP
@IMSoP,确实如此。谢谢。已更新答案。 - Ashutosh Jindal

-1
$ foo=5;bar=6; echo "$foo $bar"
5 6

3
这会“永久地”设置 foobar 的值,也就是说它们将在整个会话中保持为 5 和 6,之前的值将会丢失。这与为特定命令上下文地设置它们不同。 - IMSoP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接