我想将一个带有空格的环境变量传递给apache。Apache使用env来启动自己,所以实际上我必须制作一些类似于的东西
export MYCMD=" env -i FOO=123 456"
$MYCMD
结果是
env: 456: No such file or directory
看着strace的输出,我看到了这个
execve("/usr/bin/env", ["env", "-i", "FOO=123\", "456"], [/* 41 vars */]) = 0
正如您所看到的,env实用程序由于空间的原因将我的FOO变量拆分为另外两个变量。我已经尝试了各种各样的选项,试图在env消化完命令后保持空间,但到目前为止还没有成功。
你可以在自己的上尝试
env -i FOO=123 456
FOO=123 456
一切正常
execve("/usr/bin/env", ["env", "-i", "FOO=123 456"],
当您将命令放入另一个环境变量时,就会出现问题
由于这就是Apache启动代码的作用,我不得不为这个难题找到一个解决方案。
非常感谢。
我可能误解了您想要什么,但您可以尝试使用数组而不是简单的变量。
export MYCMD=( env -i "FOO=123 456" )
"${MYCMD[@]}"
我怀疑这对您来说有点太简单了,因为"导出"数组实际上并不起作用。我认为bash
在使"导出"数组对子shell可见方面做了一些巧妙的操作,但严格来说,环境变量只是一个命名字符串,没有任何其他类型的结构。
MYCMD
究竟是如何使用的?你把它放在哪个文件里?对环境的更改仍然存在,因此如果要在启动Apache的命令的环境中设置FOO="123 456"
,Apache也将继承FOO
。
问题似乎是第二级引用(eample中的反斜杠)不是由shell计算的。
你有没有机会像一样调用你的命令
eval "$MYCMD"
相反?