根据手册
env HELLO='Hello World' echo $HELLO
应该回应Hello World,但是没有。
如果我做
HELLO='Hello World' bash -c 'echo $HELLO'
它按预期打印Hello World(感谢this answer的这个信息)。
我在这里缺少什么?
干杯,
尼克拉斯
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”。
> subshell运行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并打印出来。可变扩展仅由外壳完成。