Systemd
systemd ExecStart 中的轉義字元失敗
我有以下程式碼片段從 jenkins 伺服器 jnlp 配置文件中提取值。它在終端中開箱即用,但不能作為一個單元使用。我想要一個單位,這樣我就可以將值放在某個地方並將其用作環境變數。但是我不斷收到轉義序列錯誤。我發現這表明我只需要擔心引號和斜杠,但我得到了相同的結果。這是
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'
我嘗試了許多轉義字元的組合都無濟於事。此外,我使用相同的模式從元數據中提取值(使用 curl、管道等)並且效果很好。絕對對這裡發生的事情感到困惑
調試它的簡單方法是向 中添加選項
-v
,sh -c
以查看 systemd 實際傳遞的內容。如果我們這樣做,我們可以看到我們得到(為了可讀性而減少):curl ... | sed "s/... main-class="hudson...">.../\1/" >>...
語法錯誤是給 sed 的雙引號命令在其中包含
"
而不是\"
. 這是因為 systemd在字元串中不加選擇地替換\"
了 by 。"``ExecStart
您需要
sh
通過使用\\
(systemd 將減少為\
)傳遞反斜杠,然後使用雙引號:ExecStart=/bin/sh -cv 'curl... | sed "s/...main-class=\\"hudson...