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

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

根据手册

env HELLO='Hello World' echo $HELLO

应该回应Hello World,但是没有。
如果我做

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

它按预期打印Hello World(感谢this answer的这个信息)。

我在这里缺少什么?

干杯,
尼克拉斯

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

env HELLO =’Hello World’echo $ HELLO

会这样做:

>展开任何给定的变量,在这种情况下为$ HELLO
>使用3个参数’HELLO = Hello World’,’echo’和”(一个空字符串)运行env,因为在当前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”。
> subshel​​l运行echo’Hello World’

如果你试图做例如这个:

env HELLO =’Hello World’echo’$ HELLO’

>当前的shell会扩展任何可以的东西,这是因为$ HELLO被包含在单引号中
>运行env与3个参数’HELLO = Hello World’,’echo’和’$ HELLO’
> env命令将在其环境中运行并设置HELLO =’Hello World’
> env将使用参数’$ HELLO’运行echo

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

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...