Error de caracteres de escape en systemd ExecStart
Tengo el siguiente fragmento para extraer un valor de un archivo de configuración jnlp del servidor jenkins. Funciona de inmediato en el terminal, pero no como una unidad. Quiero una unidad para poder poner el valor en algún lugar y usarlo como variable de entorno. Sin embargo, sigo recibiendo un error de secuencia de escape. Encontré esto, lo que sugiere que solo necesito preocuparme por las comillas y las barras, pero obtengo el mismo resultado. Aquí está el ExecStartdel archivo con el sed incluido:
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'
He probado muchas combinaciones de caracteres de escape en vano. Además, utilizo un patrón idéntico para extraer un valor de los metadatos (usando curl, piping, etc.) y eso funciona bien. Definitivamente confundido sobre lo que está sucediendo aquí.
Respuestas
La forma más fácil de depurar esto es agregar una opción -val sh -cpara ver qué systemd realmente lo está pasando. Si hacemos esto, podemos ver que estamos obteniendo (reducido para legibilidad):
curl ... | sed "s/... main-class="hudson...">.../\1/" >>...
El error de sintaxis es que el comando entre comillas dobles dado a sed tiene dentro en "lugar de \". Esto se debe a que systemd reemplaza \"por "indiscriminadamente en la ExecStartcadena.
Debe pasar una barra invertida a shusando \\(a qué systemd se reducirá \), luego las comillas dobles:
ExecStart=/bin/sh -cv 'curl... | sed "s/...main-class=\\"hudson...