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

请考虑以下代码段:


$ SOMEVAR=AAA

$ echo zzz $SOMEVAR zzz

zzz AAA zzz

在这里,我将第一行设置$SOMEVAR为AAA-在第二行中回显它时,AAA将按预期获得内容。


但是,如果我尝试在与以下命令相同的命令行上指定变量echo:


$ SOMEVAR=BBB echo zzz $SOMEVAR zzz

zzz AAA zzz

...我没有得到BBB我期望的-我得到了旧值(AAA)。


这是应该的样子吗?如果是这样,那您怎么能指定like这样的变量LD_PRELOAD=/... program args ...并使其起作用呢?我想念什么?


冉冉说
浏览 435回答 3
3回答

慕的地6264312

您看到的是预期的行为。问题在于父外壳程序$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)该变量仅在子外壳中设置

浮云间

要实现您想要的,请使用( SOMEVAR=BBB; echo zzz $SOMEVAR zzz )原因:您必须用分号或换行符将分配与下一个命令分开,否则在下一个命令(echo)发生参数扩展之前不会执行该分配。您需要在子Shell环境中进行分配,以确保其不会在当前行之外持续存在。该解决方案比其他建议的解决方案更短,更整洁且更有效,特别是它不会创建新的过程。
打开App,查看更多内容
随时随地看视频慕课网APP