使用env在bash中为一个程序调用设置环境变量

时间:2012-12-21 22:36:13

标签: bash unix environment-variables environment

我试图通过命令env调用带有修改环境的shell命令。

根据手册

env HELLO='Hello World' echo $HELLO

应该回显Hello World,但事实并非如此。 如果我做

HELLO='Hello World' bash -c 'echo $HELLO'

按预期打印Hello World(感谢this answer获取此信息)。

我在这里缺少什么?

干杯, 尼古拉斯

5 个答案:

答案 0 :(得分:44)

这是因为在您的第一种情况下,您的当前shell会在运行命令之前扩展$ HELLO变量。并且在当前shell中没有设置HELLO变量。

env HELLO='Hello World' echo $HELLO

会这样做:

  • 展开给定的任何变量,在本例中为$ HELLO
  • 使用3个参数运行env'HELLO = Hello World','echo'和''(空字符串,因为当前shell中没有设置HELLO变量)
  • env命令将运行并在其环境中设置HELLO ='Hello World'
  • env将使用参数''(空字符串)
  • 运行echo

如您所见,当前shell扩展了$ HELLO变量,该变量未设置。

HELLO='Hello World' bash -c 'echo $HELLO'

会这样做:

  • 为以下命令设置变量HELLO='Hello World
  • 使用2个参数'-c'和'echo $ HELLO'
  • 运行bash
  • 由于最后一个参数用单引号括起来,因此其中的任何内容都不会被展开
  • 新的bash将依次运行命令echo $HELLO
  • 要在新的bash子shell中运行echo $ HELLO,bash首先扩展它可以做的任何事情,在这种情况下为$ HELLO,而父shell为我们设置为“Hello World”。
  • 子shell运行echo'Hello World'

如果你试图做,例如这样:

env HELLO='Hello World' echo '$HELLO'

  • 当前的shell会扩展它所能做的任何事情,这是因为$ HELLO用单引号括起来
  • 使用3个参数运行env'HELLO = Hello World','echo'和'$ HELLO'
  • env命令将运行并在其环境中设置HELLO ='Hello World'
  • env将使用参数'$ HELLO'
  • 运行echo

在这种情况下,没有shell会扩展$ HELLO,因此echo接收字符串$HELLO并打印出来。变量扩展仅由shell完成。

答案 1 :(得分:4)

我认为发生的事情类似于this situation,其中我也感到困惑。

简而言之,第一种情况下的变量扩展是由当前shell在其环境中没有$HELLO完成的。但是在第二种情况下,单引号会阻止当前shell执行变量扩展,因此一切都按预期工作。

请注意,将单引号更改为双引号会阻止此命令以您希望的方式运行:

HELLO='Hello World' bash -c "echo $HELLO"

现在这将失败的原因与你问题中的第一个命令相同。

答案 2 :(得分:2)

这对我很有用

$ MY_VAR='Hello' ANOTHER_VAR='World!!!' && echo "$MY_VAR $ANOTHER_VAR"
Hello World!!!

答案 3 :(得分:0)

这是一种更简单的方法来确认shell是否按预期工作。

env A=42 env
env

第一个命令将集A运行到42并运行env。第二个命令也运行运行env。比较两者的输出。

答案 4 :(得分:0)

正如 nos 所指出的,传递给 echo 的变量的扩展发生在该变量被设置之前。

之前的答案中尚未提到的一种替代方法是使用:

$ a=abc eval 'echo $a'
abc

$ echo $a
<blank>

请注意,您必须使用 a=abc cmd 语法而不是 env a=abc cmd 语法;显然,env 与内置的 eval 不兼容。

相关问题