我有一个带有参数中包含空格的systemd单元
ExecStart=command --argument="text text"
看起来systemd不识别双引号或单引号,并将参数分割为两个参数。有什么办法可以防止这种情况发生吗?我正在使用CoreOS中的systemd v218。
我有一个带有参数中包含空格的systemd单元
ExecStart=command --argument="text text"
看起来systemd不识别双引号或单引号,并将参数分割为两个参数。有什么办法可以防止这种情况发生吗?我正在使用CoreOS中的systemd v218。
systemd只识别完全包含参数的引号,例如:
ExecStart=command "--argument=text text"
可以正常工作,但是
ExecStart=command --argument="text text"
则不行。我刚遇到了这个问题,并提出了#624。
/my/path/mycommand "--myargs"
。我不得不退回到@Niki提供的解决方案,即使用环境变量。 - Bemipefe这实际上是非常困难的事情,不幸的是。我从这个答案中窃取了这些信息。唯一的方法是将您的参数放入环境文件中,然后将它们用作变量,就像在/ etc / .progconfig 中一样:
ARG1=text
ARG2=text
运行命令之前,请先导入环境文件:
EnvironmentFile=/etc/.progconf
ExecStart = command $ARG1 $ARG2
Environment='ARGUMENT=text text'
和 ExecStart = command --argument=$ARGUMENT
,它可以正常工作! - WolfgangSPACEYARG="i love spaces"
然而,在您的单元文件中,您需要使用花括号将该参数包装起来,以便空格能够正确地传递。
EnvironmentFile=/etc/.progconf
ExecStart = command ${SPACEYARG}
我认为最近版本的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
环境是实现这一目标的一种方式。
您还可以使用\s
作为空格,所以ExecStart将是:
ExecStart=command --argument="text=\stext"
参考链接:https://www.freedesktop.org/software/systemd/man/systemd.service.html#Command%20lines
这是一个关于"命令行"的文档,其中包含了systemd服务的相关信息。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"
尝试转义空格,像这样:
ExecStart=command --argument="text\ text"
(引号可能需要也可能不需要。)