Как я могу использовать пробелы в аргументах командной строки systemd?

У меня есть модуль systemd с пробелами в аргументе

ExecStart=command --argument="text text"

Кажется, что systemd не распознает двойные или одинарные кавычки и разбивает аргумент на два аргумента. Любая идея, как я могу предотвратить это? Я использую systemd v218 в CoreOS.


person Wolfgang    schedule 05.03.2015    source источник
comment
Побег с обратной косой чертой?   -  person Drux    schedule 05.03.2015
comment
ссылка на документ: freedesktop.org/software/systemd/man /   -  person Antonios Hadjigeorgalis    schedule 26.09.2017


Ответы (7)


Это на самом деле удивительно трудно сделать, к сожалению. Я украл эту информацию из этого ответа. Единственный способ сделать это — поместить ваши аргументы в файл среды, а затем использовать их как переменные как таковые (например, в /etc/.progconfig):

ARG1=text
ARG2=text

Затем импортируйте файл среды перед запуском команды:

EnvironmentFile=/etc/.progconf
ExecStart = command $ARG1 $ARG2
person nico    schedule 05.03.2015
comment
Спасибо, теперь я использую Environment='ARGUMENT=text text' и ExecStart = command --argument=$ARGUMENT, и это работает! - person Wolfgang; 05.03.2015
comment
Можете ли вы объяснить более кратко, как вы этого добились? - person Konstantin; 01.08.2019

systemd, кажется, распознает только кавычки, которые полностью заключают в себе аргументы; то есть

ExecStart=command "--argument=text text"

работает, но

ExecStart=command --argument="text text"

не. Я только что столкнулся с этой проблемой и написал о ней #624.

person Tgr    schedule 19.07.2015
comment
Я только что столкнулся с этой проблемой, и мне нужно несколько часов, чтобы понять - person tuna; 11.12.2018

Я думаю, что последние версии 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
person Jack O'Connor    schedule 14.12.2017

Как предложил Нико, вы можете создать EvironmentFile, в котором вы можете указать аргумент с пробелами.

SPACEYARG="i love spaces"

Однако в вашем файле модуля вам нужно будет заключить этот аргумент в фигурные скобки, чтобы пробелы передавались правильно.

EnvironmentFile=/etc/.progconf
ExecStart = command ${SPACEYARG}
person Niki    schedule 13.06.2016

Окружающая среда — это способ сделать это.

Вы также можете использовать \s в качестве пробела, поэтому ExecStart будет:

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

ссылка: https://www.freedesktop.org/software/systemd/man/systemd.service.html#Command%20lines

person panduora    schedule 09.08.2019

Сервисный файл 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

Но вы можете на самом деле установить это, если приложению необходимо прочитать всю строку как 2 аргумента, каждый аргумент между "" (не проверено)

ExecStart=command "$ARG1" "$ARG2"
person Radu Toader    schedule 09.03.2019

Попробуйте избежать пробела, например:

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

(Кавычки могут быть нужны, а могут и не быть.)

person evanscott815    schedule 05.03.2015