为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我不能指定环境变量并在同一命令行中回显它?

为什么我不能指定环境变量并在同一命令行中回显它?

冉冉说 2019-11-13 14:39:09
请考虑以下代码段:$ SOMEVAR=AAA$ echo zzz $SOMEVAR zzzzzz AAA zzz在这里,我将第一行设置$SOMEVAR为AAA-在第二行中回显它时,AAA将按预期获得内容。但是,如果我尝试在与以下命令相同的命令行上指定变量echo:$ SOMEVAR=BBB echo zzz $SOMEVAR zzzzzz AAA zzz...我没有得到BBB我期望的-我得到了旧值(AAA)。这是应该的样子吗?如果是这样,那您怎么能指定like这样的变量LD_PRELOAD=/... program args ...并使其起作用呢?我想念什么?
查看完整描述

3 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

您看到的是预期的行为。问题在于父外壳程序$SOMEVAR在使用修改后的环境调用命令之前会在命令行上求值。您需要获得$SOMEVAR推迟评估,直到设置了环境。


您的直接选择包括:


SOMEVAR=BBB eval echo zzz '$SOMEVAR' zzz。

SOMEVAR=BBB sh -c 'echo zzz $SOMEVAR zzz'。

两者都使用单引号防止父外壳评估$SOMEVAR; 仅在环境中设置它之后(临时,在单个命令的持续时间内)才对它进行评估。


另一个选择是使用sub-shell表示法(也由Marcus Kuhn在他的答案中建议):


(SOMEVAR=BBB; echo zzz $SOMEVAR zzz)

该变量仅在子外壳中设置


查看完整回答
反对 回复 2019-11-13
?
浮云间

TA贡献1829条经验 获得超3个赞


要实现您想要的,请使用


( SOMEVAR=BBB; echo zzz $SOMEVAR zzz )

原因:


您必须用分号或换行符将分配与下一个命令分开,否则在下一个命令(echo)发生参数扩展之前不会执行该分配。


您需要在子Shell环境中进行分配,以确保其不会在当前行之外持续存在。


该解决方案比其他建议的解决方案更短,更整洁且更有效,特别是它不会创建新的过程。


查看完整回答
反对 回复 2019-11-13
  • 3 回答
  • 0 关注
  • 432 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信