उसी लाइन पर वैरिएबल निर्यात करने के लिए क्यों नहीं, जिसे आप उन्हें असाइन करते हैं?


44

से पिछला आदेश की अंतिम तर्क क्या है?

शेलचेक बताता है कि आप उसी लाइन पर वेरिएबल का निर्यात नहीं करते हैं जो आप उन्हें सौंपते हैं।

मैं सोच रहा था कि क्यों?

एक ही सलाह लागू होती है करने के लिए alias, declare, export, local, readonly, और typeset?




9
प्रश्न में शेलचेक नियम SC2155 है। शेलचेक विकी में बहुत अच्छा दस्तावेज है ।
फुनेहे

3
इसके अलावा कुछ पुराने गोले exportएक साथ स्वीकार नहीं करेंगे और असाइनमेंट नहीं करेंगे । विरासत बॉर्न शैल , उदाहरण के लिए, आउटपुट एक "foo = 2 एक पहचानकर्ता नहीं है" त्रुटि।
डेनिस विलियमसन

जवाबों:


54

समस्या यह है कि बैश में हर आदेश केवल एक बाहर निकलें कोड है। जब आप export foo="$(false)"से बाहर निकलें कोड falseबस त्याग दिया है। यदि आप इसके बजाय करते हैं

foo="$(false)"
export foo

फेल होने वाले पहले कमांड पर errexitसेटिंग द्वारा काम किया जा सकता है, उदाहरण के लिए ।

एक स्ट्रिंग शाब्दिक की घोषणा और असाइन करना जैसे कि export foo='bar'इस समस्या से ग्रस्त नहीं है। लेकिन सॉफ्टवेयर विकास में परिवर्तन एकमात्र स्थिर है, और इस तरह के बयानों को विभाजित करके भविष्य के सबूत के लिए बस अच्छा हाउसकीपिंग है।

असाइनमेंट के विशिष्ट आदेशों के अलावा आप उल्लेख करते हैं कि एकल असाइनमेंट जैसे कई कमांड भी हैं foo="$(false)$(true)"। देखें pipefailमें man bashअभी तक एक और इस तरह के जाल के लिए।

एक और बात याद रखें कि घोषणा और असाइनमेंट का क्रम कभी-कभी प्रासंगिक होता है। उदाहरण के लिए, आप उन्हें असाइन करने से पहले चर घोषित करना चाहते हैं। (दुर्भाग्य से पहली बार उन्हें असाइन करने से पहले चर घोषित करना संभव नहीं है ।)local readonly


इसलिए यदि कोई एक शाब्दिक से एक चर सेट कर रहा है, और छोड़ने के लिए कोई निकास कोड नहीं है, तो यह सब एक पंक्ति में करने के साथ कुछ भी गलत नहीं है।
मोंटी हार्डर

1
जहाँ तक इस शेलचेक त्रुटि का संबंध है, नहीं। लेकिन जैसा कि अब हटाए गए उत्तर उनके बीच आधे-सही हो गए, बॉर्न शेल ने असाइनमेंट सिंटैक्स के लिए समर्थन नहीं किया export, इसलिए कुछ वर्षों के लिए ऐसा करने के बारे में ज्ञान प्राप्त हुआ था अगर किसी के दुभाषिए के बॉर्न शेल होने की संभावना थी।
JdeBP

@ जेडेबीपी, ध्यान दें कि बॉर्न शेल ने समर्थन किया था foo=$(cmd) export foo, हालांकि एक ही चेतावनी के साथ कि cmdनिकास की स्थिति खो गई है (लेकिन असफल होने पर शेल से बाहर निकलने का कारण बना set -e)।
स्टीफन चेज़लस

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