我有一个在参数
中有空格的systemd单元ExecStart=command --argument="text text"
似乎systemd无法识别双引号或单引号,它将参数拆分为两个参数。知道如何防止这种情况吗?我在CoreOS中使用systemd v218。
答案 0 :(得分:13)
systemd似乎只识别完全包装参数的引号;即。
ExecStart=command "--argument=text text"
有效但
ExecStart=command --argument="text text"
没有。我刚刚遇到了这个问题并提交了#624。
答案 1 :(得分:12)
遗憾的是,这实际上非常难以做到。我从this answer偷了这个信息。唯一的方法是将您的参数放在一个环境文件中,然后将它们用作变量(如在/etc/.progconfig中):
ARG1=text
ARG2=text
然后在运行命令之前导入环境文件:
EnvironmentFile=/etc/.progconf
ExecStart = command $ARG1 $ARG2
答案 2 :(得分:2)
正如Nico建议的那样,您可以创建一个EvironmentFile,您可以在其中指定带空格的参数。
SPACEYARG="i love spaces"
但是,在您的单元文件中,您需要将该参数包装在大括号中,以便正确传递空格。
EnvironmentFile=/etc/.progconf
ExecStart = command ${SPACEYARG}
答案 3 :(得分:2)
我认为最新版本的systemd已经开始在参数中间接受引号,更接近bash接受的内容。但是,@ Tgr的答案仍然是正确的,值得详细说明。引用整个参数,包括标志名称,在此处起作用。如果你这样做:
ExecStart=command "--argument=text text"
然后systemd会将--argument=text text
理解为单个位置参数。您不必担心在该空间发生任何更多分裂。你可以在bash中看到相同的行为:
$ echo "--silly-flag=spaces are preserved here"
--silly-flag=spaces are preserved here
答案 4 :(得分:1)
环境是一种实现方法。
您还可以使用\s
作为空格,因此ExecStart将为:
ExecStart=command --argument="text=\stext"
ref:https://www.freedesktop.org/software/systemd/man/systemd.service.html#Command%20lines
答案 5 :(得分:-2)
尝试逃避空间,如下:
ExecStart=command --argument="text\ text"
(报价可能是也可能不是必需的。)