微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用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并打印出来。可变扩展仅由外壳完成。

原文地址:https://www.jb51.cc/bash/388216.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐