Systemd ExecStart में पात्र बच जाते हैं

Oct 16 2020

मेरे पास jenkins सर्वर jnlp config फाइल से मान निकालने के लिए निम्नलिखित स्निपेट हैं। यह टर्मिनल में बॉक्स से बाहर काम करता है, लेकिन एक इकाई के रूप में नहीं। मुझे एक इकाई चाहिए ताकि मैं मूल्य को कहीं रख सकूं और पर्यावरण चर के रूप में उपयोग कर सकूं। हालाँकि मुझे एक एस्केप सीक्वेंस एरर मिलता रहता है। मैंने यह पाया जो बताता है कि मुझे केवल उद्धरण और स्लैश के बारे में चिंता करने की ज़रूरत है, लेकिन मुझे एक ही परिणाम मिलता है। यहाँ ExecStartफ़ाइल में सेड के साथ शामिल है:

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 को दी गई डबल-कोट्स कमांड इसके "बजाय इसके अंदर है \"। इसका कारण यह है कि सिस्टमड स्ट्रिंग में अंधाधुंध \"द्वारा प्रतिस्थापित "करता ExecStartहै।

आपको बैकस्लैश पास करने की आवश्यकता है, जिसके shउपयोग से \\(जो सिस्टमड को कम करेगा \), फिर डबल-कोट:

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