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

16

我有一个带有参数中包含空格的systemd单元

ExecStart=command --argument="text text"

看起来systemd不识别双引号或单引号,并将参数分割为两个参数。有什么办法可以防止这种情况发生吗?我正在使用CoreOS中的systemd v218。


使用反斜杠进行转义? - Drux
1
请参考以下链接中的内容,了解有关命令行的更多信息:https://www.freedesktop.org/software/systemd/man/systemd.service.html#Command%20lines - Antonios Hadjigeorgalis
7个回答

18

systemd只识别完全包含参数的引号,例如:

ExecStart=command "--argument=text text"

可以正常工作,但是

ExecStart=command --argument="text text"

则不行。我刚遇到了这个问题,并提出了#624


1
我刚遇到了这个问题,花费了我几个小时才解决。 - tuna
使用systemd-246,即使用双引号把所有的参数都包起来也不起作用。在我的情况下,命令是/my/path/mycommand "--myargs"。我不得不退回到@Niki提供的解决方案,即使用环境变量。 - Bemipefe

14

这实际上是非常困难的事情,不幸的是。我从这个答案中窃取了这些信息。唯一的方法是将您的参数放入环境文件中,然后将它们用作变量,就像在/ etc / .progconfig 中一样:

ARG1=text
ARG2=text

运行命令之前,请先导入环境文件:

EnvironmentFile=/etc/.progconf
ExecStart = command $ARG1 $ARG2

7
谢谢,我现在使用的是 Environment='ARGUMENT=text text'ExecStart = command --argument=$ARGUMENT,它可以正常工作! - Wolfgang
你能简要地解释一下你是如何实现它的吗? - Konstantin
根据点赞数量来看,这个方法可能在某个时候是有效的。但是现在已经不再起作用了,至少在RHEL 7上不行(这个版本已经相当老了)。变量需要像@Niki的答案中所示使用大括号传递。 - Karel Vlk

6
如Nico所建议的,您可以创建一个EvironmentFile,在其中指定带有空格的参数。
SPACEYARG="i love spaces"

然而,在您的单元文件中,您需要使用花括号将该参数包装起来,以便空格能够正确地传递。

EnvironmentFile=/etc/.progconf
ExecStart = command ${SPACEYARG}

@nico的解决方案对我没有用。在变量名周围使用双引号也不行。但是花括号确实有效。谢谢。 - Karel Vlk

5

我认为最近版本的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

3

1
系统服务文件支持这个功能。
Environment="TEST=one word"
Environment="TEST2=second word"

ExecStartPre=-/bin/echo start pre
ExecStartPre=/bin/echo start pre mandatory
ExecStart=/bin/echo started : ${TEST} $TEST2
ExecStartPost=-/bin/echo start post
ExecStartPost=/bin/echo start post mandatory
ExecStop=/bin/echo stop
ExecStopPost=-/bin/echo stop post
ExecStopPost=/bin/echo stop post mandatory
ExecReload=/bin/echo reload

日志:

Mar 09 21:39:47 gitlab-runner-1 echo[30286]: start pre
Mar 09 21:39:47 gitlab-runner-1 echo[30288]: start pre mandatory
Mar 09 21:39:47 gitlab-runner-1 echo[30295]: started : one word second word
Mar 09 21:39:47 gitlab-runner-1 echo[30296]: start post
Mar 09 21:39:47 gitlab-runner-1 echo[30297]: start post mandatory
Mar 09 21:39:47 gitlab-runner-1 echo[30298]: stop
Mar 09 21:39:47 gitlab-runner-1 echo[30299]: stop post
Mar 09 21:39:47 gitlab-runner-1 echo[30300]: stop post mandatory

但是如果应用程序需要将整个字符串作为两个参数读取,每个参数之间用 "" 包裹,则您可能希望设置此项(未经测试)

ExecStart=command "$ARG1" "$ARG2"

-3

尝试转义空格,像这样:

ExecStart=command --argument="text\ text"

(引号可能需要也可能不需要。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接