![systemd ExecStart 中的转义字符失败](https://linux22.com/image/758799/systemd%20ExecStart%20%E4%B8%AD%E7%9A%84%E8%BD%AC%E4%B9%89%E5%AD%97%E7%AC%A6%E5%A4%B1%E8%B4%A5.png)
我有以下代码片段,用于从 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、管道等),效果很好。我完全搞不清楚这里发生了什么
答案1
调试此问题的简单方法是将选项添加-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...