通常,可以通过为命令添加前缀来为命令设置环境变量,如下所示:
hello=hi bash -c 'echo $hello'
我也知道我们可以使用变量来替换命令调用的任何部分,如下所示:
$ cmd=bash
$ $cmd -c "echo hi" # equivalent to bash -c "echo hi"
我很惊讶地发现您不能使用变量来为命令添加前缀来设置环境变量。测试用例:
$ prefix=hello=hi
$ echo $prefix # prints hello=hi
$ $prefix bash -c 'echo $hello'
hello=hi: command not found
为什么不能使用变量设置环境变量?前缀部分是特殊部分吗?我能够通过在前面使用 eval 来使其工作,但我仍然不明白为什么。我正在使用 bash 4.4。
我怀疑这是吸引你的序列的一部分:
这来自简单命令扩展部分的Bash 参考手册。
在
cmd=bash
示例中,没有设置环境变量,bash 通过参数扩展处理命令行,留下bash -c "echo hi"
.在
prefix=hello=hi
示例中,第一次传递中再次没有变量赋值,因此处理继续进行参数扩展,导致第一个单词hello=hi
.一旦处理了变量分配,它们就不会在命令执行期间重新处理。
请参阅下面的处理及其结果
set -x
:要获得比 更安全的“变量扩展”变体 -as-“环境变量”
eval
,请考虑wjandrea 的建议env
:这不是严格意义上的命令行变量赋值,因为我们使用的是
env
实用程序的主要功能,即为命令分配环境变量,但它实现了相同的目标。$prefix
变量在命令行处理过程中被扩展,将 name=value 提供给,env
然后将其传递给bash
。因为
$prefix
不是任务。@Jeff 有更长的解释。你可以用一个函数做类似的事情:
...如果您愿意,您甚至可以堆叠它们: