อักขระ Escape ใน systemd ExecStart ล้มเหลว

Oct 16 2020

ฉันมีข้อมูลโค้ดต่อไปนี้เพื่อดึงค่าจากไฟล์ config jnlp ของเซิร์ฟเวอร์ jenkins ใช้งานได้นอกกรอบในเทอร์มินัล แต่ไม่ใช่ยูนิต ฉันต้องการหน่วยเพื่อให้ใส่ค่าไว้ที่ใดที่หนึ่งและใช้เป็นตัวแปรสภาพแวดล้อม อย่างไรก็ตามฉันได้รับข้อผิดพลาดลำดับการหลบหนี ฉันพบสิ่งนี้ซึ่งแสดงให้เห็นว่าฉันต้องกังวลเกี่ยวกับเครื่องหมายคำพูดและเครื่องหมายทับ แต่ฉันได้รับผลลัพธ์เดียวกัน นี่คือ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'

ฉันได้ลองใช้อักขระ Escape หลายชุดแล้ว แต่ก็ไม่มีประโยชน์ นอกจากนี้ฉันใช้รูปแบบที่เหมือนกันเพื่อดึงค่าจากข้อมูลเมตา (โดยใช้ curl, piping ฯลฯ ) และใช้งานได้ดี สับสนกับสิ่งที่เกิดขึ้นที่นี่

คำตอบ

1 meuh Oct 16 2020 at 18:53

วิธีง่ายๆในการแก้ปัญหานี้คือการเพิ่มตัวเลือก-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...