systemd ExecStart의 이스케이프 문자가 실패합니다.

Oct 16 2020

jenkins 서버 jnlp 구성 파일에서 값을 추출하는 다음 코드 조각이 있습니다. 그것은 터미널에서 즉시 작동하지만 하나의 단위로는 작동하지 않습니다. 값을 어딘가에 놓고 환경 변수로 사용할 수 있도록 단위를 원합니다. 그러나 이스케이프 시퀀스 오류가 계속 발생합니다. 나는 발견 이 난 단지 시세 및 슬래시에 대해 걱정할 필요가 제안하는,하지만 나는 같은 결과를 얻을. 다음은 ExecStartsed가 포함 된 파일입니다.

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'

이스케이프 문자 조합을 많이 시도해 보았습니다. 또한 동일한 패턴을 사용하여 메타 데이터에서 값을 추출 (컬, 파이핑 등 사용)하면 제대로 작동합니다. 여기서 무슨 일이 일어나고 있는지 확실히 혼란스러워합니다.

답변

1 meuh Oct 16 2020 at 18:53

이 디버깅 할 수있는 쉬운 방법은 옵션을 추가하는 것입니다 -v받는 sh -c사실을 통과 systemd 무엇을보기 위해. 이렇게하면 다음과 같은 결과를 얻을 수 있습니다 (가독성을 위해 감소됨).

curl ... | sed "s/... main-class="hudson...">.../\1/" >>...

구문 오류는 sed에 주어진 큰 따옴표로 묶인 명령 "\". 이는 systemd 대체합니다 \"의한 "무차별에서 ExecStart문자열입니다.

(systemd가로 줄임)을 sh사용하여 백 슬래시를 전달한 다음 큰 따옴표 를 전달해야합니다 .\\\

ExecStart=/bin/sh -cv 'curl... | sed "s/...main-class=\\"hudson...