systemd ExecStart 中的转义字符失败

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、管道等),效果很好。我完全搞不清楚这里发生了什么

答案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...

相关内容