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

Nik*_*las 28 unix bash environment environment-variables

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

根据手册

env HELLO='Hello World' echo $HELLO
Run Code Online (Sandbox Code Playgroud)

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

HELLO='Hello World' bash -c 'echo $HELLO'
Run Code Online (Sandbox Code Playgroud)

Hello World按预期打印(感谢此信息的答案).

我在这里错过了什么?

干杯,尼克拉斯

nos*_*nos 46

这是因为在第一种情况下,当前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个参数'HELLO = Hello World','echo'和'$ HELLO'运行env
  • env命令将运行并在其环境中设置HELLO ='Hello World'
  • env将使用参数'$ HELLO'运行echo

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

  • +1,只是一个挑剔:“env HELLO='Hello World' echo $HELLO”将扩展为“env HELLO='Hello World' echo”(没有要回显的参数。)。`env HELLO='Hello World' echo "$HELLO"` 将扩展为 `env HELLO='Hello World' echo ''` (要回显的空字符串参数。) (2认同)

Lev*_*sky 5

我想所发生的情况与我也感到困惑的情况类似。

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

请注意,将单引号更改为双引号会如何阻止此命令按您想要的方式工作:

HELLO='Hello World' bash -c "echo $HELLO"
Run Code Online (Sandbox Code Playgroud)

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