बैश पैरामीटर विस्तार सिस्टमड सर्विस फ़ाइलों के अंदर काम क्यों नहीं करता है?


14

मैं उपयोग करने के लिए कोशिश कर रहा हूँ systemdकी EnvironmentFileऔर आदेश के लिए एक विकल्प जोड़ने जब यह फ़ाइल में सेट है। मैं इकाई फ़ाइल में निम्नलिखित है:

ExecStart=/usr/bin/bash -c "echo ${PORT:+port is $PORT}"

जब मैं सेवा शुरू करता हूं तो कुछ भी गूँजता नहीं है।

निम्नलिखित उम्मीद के अनुसार काम करता है:

ExecStart=/usr/bin/bash -c "echo port is $PORT"

जिसका अर्थ है कि फ़ाइल सही ढंग से पढ़ी गई है।

पैरामीटर प्रतिस्थापन भी कमांड लाइन पर काम करता है:

$ PORT=1234 bash -c 'echo ${PORT:+port is $PORT}'
port is 1234

मुझे किसकी याद आ रही है?

जवाबों:


27

systemd अपनी न्यूनतम शेल-शैली कमांड लाइन की सामग्री ExecStart=और अन्य मापदंडों की पार्सिंग करता है। यह न्यूनतर पार्सिंग बुनियादी पर्यावरण चर प्रतिस्थापन का समर्थन करता है, लेकिन स्पष्ट रूप से जैसी चीजें नहीं हैं ${PORT:+port is $PORT}

आप सिस्टमड को ऐसा करने से रोकना चाहते हैं और आह्वान किए गए शेल को संभालने दें।

प्रलेखन से:

शाब्दिक डॉलर के संकेत को पारित करने के लिए, " $$" का उपयोग करें ।

तो यह प्रयास करें:

ExecStart=/usr/bin/bash -c "echo $${PORT:+port is $$PORT}"

या बेहतर अभी तक, यह प्रयास करें:

ExecStart=/bin/sh -c "echo $${PORT:+port is $$PORT}"

क्योंकि आपके द्वारा यहां किया जा रहा परिवर्तनशील विस्तार POSIX मानक है और यह बैश-इस्म नहीं है। आप के /bin/shबजाय का उपयोग करके bashएक अनावश्यक निर्भरता को दूर करेगा bash

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.