Escape-символы в systemd ExecStart не работают
У меня есть следующий фрагмент для извлечения значения из файла конфигурации jnlp сервера jenkins. Он работает в терминале «из коробки», но не как единое целое. Мне нужна единица измерения, чтобы я мог куда-нибудь поместить значение и использовать его как переменную среды. Однако я продолжаю получать ошибку escape-последовательности. Я нашел это, что говорит о том, что мне нужно беспокоиться только о кавычках и косых чертах, но я получаю тот же результат. Вот ExecStartфайл с включенным sed:
ExecStart=/bin/sh -c 'curl -L -s -X GET http://10.x.x.x:8080/computer/name-of-executor/slave-agent.jnlp | sed \"s/.*<application-desc main-class=\"hudson.remoting.jnlp.Main\"><argument>\([a-z0-9]*\).*/\1/\" >> /etc/build_environment'
Я пробовал множество комбинаций escape-символов, но безрезультатно. Кроме того, я использую идентичный шаблон для извлечения значения из метаданных (используя curl, piping и т. Д.), И он отлично работает. Определенно смущен тем, что здесь происходит
Ответы
Простой способ отладки это добавить параметр -vк sh -cдля того , чтобы увидеть , что Systemd на самом деле его принятия. Если мы сделаем это, мы увидим, что получаем (уменьшено для удобства чтения):
curl ... | sed "s/... main-class="hudson...">.../\1/" >>...
Синтаксическая ошибка заключается в том, что команда sed в двойных кавычках имеет внутри "вместо \". Это происходит потому , что Systemd заменяет \"по "разбору в ExecStartстроке.
Вам нужно передать обратную косую черту sh, используя \\(что systemd сократит до \), а затем двойные кавычки:
ExecStart=/bin/sh -cv 'curl... | sed "s/...main-class=\\"hudson...