如何在systemd命令行参数中使用空格?

时间:2015-03-05 15:37:29

标签: systemd

我有一个在参数

中有空格的systemd单元
ExecStart=command --argument="text text"

似乎systemd无法识别双引号或单引号,它将参数拆分为两个参数。知道如何防止这种情况吗?我在CoreOS中使用systemd v218。

6 个答案:

答案 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"

(报价可能是也可能不是必需的。)