考虑这个片段:
$ SOMEVAR=AAA
$ echo zzz $SOMEVAR zzz
zzz AAA zzz
这里我设置了$SOMEVAR
to AAA
在第一行 - 当我在第二行回显它时,我得到了AAA
内容如预期。
但是,如果我尝试在同一命令行上指定变量echo
:
$ SOMEVAR=BBB echo zzz $SOMEVAR zzz
zzz AAA zzz
... 我不明白BBB
正如我所料 - 我得到了旧值(AAA
).
事情就应该是这样吗?如果是这样,那么你为什么可以指定变量,例如LD_PRELOAD=/... program args ...
并能发挥作用吗?我缺少什么?
您所看到的是预期的行为。问题是父 shell 会评估$SOMEVAR
在命令行上,然后使用修改后的环境调用命令。您需要获得以下评价$SOMEVAR
推迟到环境设置之后。
您的直接选择包括:
-
SOMEVAR=BBB eval echo zzz '$SOMEVAR' zzz
.
-
SOMEVAR=BBB sh -c 'echo zzz $SOMEVAR zzz'
.
这两个都使用单引号来防止父 shell 评估$SOMEVAR
;仅在环境中设置后才对其进行评估(暂时,在单个命令的持续时间内)。
另一种选择是使用子 shell 表示法(也由马库斯·库恩 https://stackoverflow.com/users/1990689/markus-kuhn in his answer https://stackoverflow.com/a/14400951/15168):
(SOMEVAR=BBB; echo zzz $SOMEVAR zzz)
该变量仅在子 shell 中设置
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)