I caratteri di escape in systemd ExecStart falliscono
Ho il seguente frammento per estrarre un valore da un file di configurazione jnlp del server jenkins. Funziona fuori dalla scatola nel terminale ma non come un'unità. Voglio un'unità in modo da poter inserire il valore da qualche parte e usarlo come variabile d'ambiente. Tuttavia continuo a ricevere un errore di sequenza di escape. Ho trovato questo che suggerisce che devo solo preoccuparmi di virgolette e barre, ma ottengo lo stesso risultato. Ecco ExecStartil file con il sed incluso:
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'
Ho provato molte combinazioni di caratteri di escape senza alcun risultato. Inoltre, utilizzo un modello identico per estrarre un valore dai metadati (utilizzando curl, piping, ecc.) E funziona bene. Decisamente confuso su ciò che sta accadendo qui
Risposte
Il modo più semplice per eseguire il debug è aggiungere un'opzione -va sh -cper vedere quale systemd lo sta effettivamente passando. Se lo facciamo possiamo vedere che stiamo ottenendo (ridotto per leggibilità):
curl ... | sed "s/... main-class="hudson...">.../\1/" >>...
L'errore di sintassi è che il comando con virgolette doppie fornito a sed ha al suo interno "invece di \". Questo perché systemd sostituisce indiscriminatamente \"da "nella ExecStartstringa.
È necessario passare una barra rovesciata shutilizzando \\(quale systemd si ridurrà a \), quindi le virgolette doppie:
ExecStart=/bin/sh -cv 'curl... | sed "s/...main-class=\\"hudson...