我有以下代码片段从 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 实际传递的内容。如果我们这样做,我们可以看到我们得到(为了可读性而减少):语法错误是给 sed 的双引号命令在其中包含
"
而不是\"
. 这是因为 systemd在字符串中不加选择地替换\"
了 by 。"
ExecStart
您需要
sh
通过使用\\
(systemd 将减少为\
)传递反斜杠,然后使用双引号: