【问题标题】:Using spaces in env vars during Apache startup在 Apache 启动期间在环境变量中使用空格
【发布时间】:2013-08-29 07:52:29
【问题描述】:

我想将一个带有空格的环境变量传递给 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
  • 如果您有其他信息要包含,您可以编辑您的原始帖子。
  • 在“一切正常”的情况下,第三个数组元素是"FOO=123 456"。我认为execve 在执行时不会将123 456 分配给FOO。如果你在 shell 提示符下输入FOO=123 456,你会得到bash: 456: command not found...

标签: apache bash shell env


【解决方案1】:

我可能误解了你想要什么,但你可以尝试使用数组而不是简单的变量。

export MYCMD=( env -i "FOO=123 456" )
"${MYCMD[@]}"

我怀疑这对你来说有点太简单了,因为“导出”一个数组并没有真正起作用。我认为bash 做了一些花招来使“导出的”数组对子shell 可见,但严格来说,环境变量只是一个没有任何其他类型结构的命名字符串。

MYCMD 究竟是如何使用的?你把它放在哪个文件里?对环境的更改会持续存在,因此如果您在启动 Apache 的命令的环境中设置 FOO="123 456",则 Apache 也会继承 FOO

【讨论】:

    【解决方案2】:

    问题似乎是第二级引用(示例中的反斜杠)没有由 shell 评估。

    你有没有机会像这样调用你的命令

    eval "$MYCMD"
    

    改为?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 2011-12-06
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      • 2018-07-19
      相关资源
      最近更新 更多