सही बैश और शेल स्क्रिप्ट चर पूंजीकरण


192

मैं सभी कैप्स में चर के साथ कई शेल स्क्रिप्ट चलाता हूं, और मैंने हमेशा सोचा है कि इसके साथ एक गंभीर गलतफहमी है। मेरी समझ यह है कि, सम्मेलन (और शायद बहुत पहले की आवश्यकता से), पर्यावरण चर सभी-कैप में हैं।

लेकिन बाश जैसे आधुनिक स्क्रिप्टिंग वातावरण में, मैंने हमेशा अस्थायी चर के लिए निचले-मामले के नामों के सम्मेलन को प्राथमिकता दी है, और ऊपरी मामले केवल निर्यात (यानी पर्यावरण) चर के लिए । उदाहरण के लिए:

#!/usr/bin/env bash
year=`date +%Y`
echo "It is $year."
export JAVA_HOME="$HOME/java"

वह हमेशा चीजों को लेकर मेरा रहा है। क्या कोई आधिकारिक स्रोत हैं जो या तो इस दृष्टिकोण से सहमत हैं या असहमत हैं, या यह विशुद्ध रूप से शैली का मामला है?

जवाबों:


262

सम्मेलन, वातावरण चर (तक PAGER, EDITOR, ...) और आंतरिक खोल चर ( SHELL, BASH_VERSION, ...) बड़े रहेंगे। अन्य सभी परिवर्तनीय नाम निम्न मामले होने चाहिए।

याद रखें कि चर नाम केस-संवेदी हैं; यह कन्वेंशन गलती से पर्यावरण और आंतरिक चर को ओवरराइड करने से बचता है।

इस अधिवेशन को ध्यान में रखते हुए, आप यह आश्वासन दे सकते हैं कि आपको ओवरराइट करने से बचने के लिए UNIX टूल या गोले द्वारा उपयोग किए जाने वाले प्रत्येक पर्यावरण चर को जानने की आवश्यकता नहीं है। यदि यह आपका वैरिएबल है, तो इसे कम कर दें। यदि आप इसे निर्यात करते हैं, तो इसे ऊपर ले जाएं।


8
+1। आकस्मिक ओवरराइटिंग के बारे में अच्छी बात है। मैं उल्लेख करना भूल गया, लेकिन अब जब आप इसका उल्लेख करते हैं, तो मुझे लगता है कि मैंने लोअरकेस का उपयोग करने का निर्णय लिया क्योंकि मैंने उस समस्या के बारे में पढ़ा या सुना।
जेसनस्मिथ

5
मुझे लगा कि अपरकेस वैरिएबल नामों का उपयोग करने का मुख्य कारण शेल कमांड के साथ टकराव से बचना है। हमारे पास हाल ही में हमारे एक सर्वर का होस्टनाम गलती से '=' में बदल गया था क्योंकि एक स्क्रिप्ट ने एक वेरिएबल 'होस्टनाम' का इस्तेमाल किया था।
ThisSuitIsBlackNot 18

25
@ThisSuitIsBlackNot गंदे कोड को अनदेखा करना, चर का विस्तार करते समय एक डॉलर के साथ उपसर्ग किया जाता है और एक जगह पर उपयोग किया जाता है जहां वे कमांड नाम के साथ भ्रमित नहीं हो सकते हैं जब वे नहीं होते हैं। जाहिर है, hostname = moo करना आपको मुश्किल में डालने वाला है। इसलिए नहीं कि आप "होस्टनाम" का उपयोग कर रहे हैं, बल्कि इसलिए कि आप सही असाइनमेंट सिंटैक्स का उपयोग नहीं कर रहे हैं। असाइनमेंट hostname = moo के साथ किया जाता है, कोई स्पेस नहीं। सही कोड मानते हुए, आपको चर नामों के बारे में चिंता करने की आवश्यकता नहीं है जो कमांड नामों के साथ परस्पर विरोधी हैं।
लहनाथ

3
सभी पाठ पुस्तकों को मैंने सभी शेल चर के लिए हमेशा उपयोगकर्ता के ऊपरी मामले में देखा है। जबकि निचले मामले चर नाम अनुमेय हैं, अपरकेस सम्मेलन है।
ब्रायन एस। विल्सन

3
मुझे यह नहीं पता था, और मैं बस एक जोड़े को खो दिया। USER="username"बश स्क्रिप्ट में उपयोग करने के बजाय ssh पर कुछ दूरस्थ कमांड को स्वचालित करना user="username"। ओह! खुशी है कि मैं अब जानता हूँ!
गेब्रियल स्टेपल्स

28

लगातार चलने वाले किसी भी नामकरण सम्मेलनों से हमेशा मदद मिलेगी। शेल चर नामकरण के लिए कुछ उपयोगी सुझाव दिए गए हैं:

  • निर्यात किए गए चर और स्थिरांक के लिए सभी कैप और अंडरस्कोर का उपयोग करें , खासकर जब वे कई लिपियों या प्रक्रियाओं में साझा किए जाते हैं। जब भी लागू हो एक सामान्य उपसर्ग का उपयोग करें ताकि संबंधित चर बाहर खड़े हो जाएं और बैश आंतरिक चर के साथ टकराव न हो जो सभी ऊपरी मामले हैं।

    उदाहरण:

    • एक सामान्य उपसर्ग के साथ निर्यात किए गए चर: JOB_HOME JOB_LOG JOB_TEMP JOB_RUN_CONTROL
    • स्थिरांक: LOG_DEBUG LOG_INFO LOG_ERROR STATUS_OK STATUS_ERROR STATUS_WARNING
  • सभी स्क्रिप्ट के लिए "स्नेक केस" ( सभी लोअरकेस और अंडरस्कोर ) का उपयोग करें, जो एक स्क्रिप्ट या ब्लॉक के लिए स्कूप किए गए हैं।

    उदाहरण: input_file first_value max_amount num_errors

    मिश्रित चर का उपयोग करें जब स्थानीय चर का पर्यावरण चर के साथ कुछ संबंध हो, जैसे: old_IFS old_HOME

  • "निजी" चर और कार्यों के लिए एक प्रमुख अंडरस्कोर का उपयोग करें । यह विशेष रूप से प्रासंगिक है यदि आप कभी भी एक शेल लाइब्रेरी लिखते हैं जहां लाइब्रेरी फ़ाइल या फ़ाइलों के भीतर फ़ंक्शन को चर को साझा करने की आवश्यकता होती है, बिना किसी चीज के साथ टकराए बिना जो कि मुख्य कोड में समान नाम हो सकता है।

    उदाहरण: _debug _debug_level _current_log_file

  • ऊंट के मामले से बचें । यह केस टाइपोस के कारण होने वाले कीड़ों को कम करेगा। याद रखें, शेल वेरिएबल केस सेंसिटिव होते हैं

    उदाहरण: inputArray thisLooksBAD, numRecordsProcessed,veryInconsistent_style


यह सभी देखें:


1
यह एक सम्मेलन है, लेकिन यह शायद ही सार्वभौमिक रूप से स्वीकार किया जाता है। ऊंट मामले के खिलाफ तर्क पूरी तरह से आश्वस्त नहीं है। निर्यात किए गए चर के लिए SHOUTING का उपयोग करने की सिफारिश हल्के रूप से विवादास्पद है।
ट्रिपल

3
मैंने यह दावा नहीं किया कि यह आमतौर पर अनुसरण किया जाने वाला सम्मेलन है। मैंने देखा है कि अधिकांश प्रोग्रामर शेल स्क्रिप्ट में मजबूत सम्मेलनों का पालन करने के बारे में गंभीरता से नहीं सोचते हैं और जो मैं कर रहा हूं उसके आधार पर अपने विचारों को बताने के बारे में सोचता हूं।
कोडफ्रेस्टर

8

यदि शेल चर पर्यावरण को निर्यात किए जा रहे हैं, तो यह विचार करने योग्य है कि POSIX (अंक 7, 2018 संस्करण) पर्यावरण चर परिभाषा निर्दिष्ट करता है:

POSIX.1-2017 के शेल और यूटिलिटीज़ वॉल्यूम में उपयोगिताओं द्वारा उपयोग किए जाने वाले पर्यावरण चर नाम केवल बड़े अक्षरों, अंकों, और अंडरस्कोर ( _) पोर्टेबल चरित्र सेट में परिभाषित वर्णों से होते हैं और एक अंक से शुरू नहीं होते हैं।

...

लोअरकेस अक्षर वाले पर्यावरण चर नामों का नाम स्थान अनुप्रयोगों के लिए आरक्षित है। अनुप्रयोग मानक उपयोगिताओं के व्यवहार को संशोधित किए बिना इस नाम स्थान से नामों के साथ किसी भी पर्यावरण चर को परिभाषित कर सकते हैं।


6

मैं वही करता हूं जो आप करते हैं। मुझे संदेह है कि एक आधिकारिक स्रोत है, लेकिन यह एक व्यापक रूप से वास्तविक मानक है।


1
मैं सहमत हूँ। ऐसा इसलिए है क्योंकि ALL_CAPS बदसूरत है, लेकिन यह अच्छा है कि पर्यावरण के लिए बदसूरत होने के कारण बाहर खड़े हों।
स्लिम

1
मैं आपसे कोडिंग शैली पर सहमत हूं, लेकिन मैं निश्चित रूप से असहमत हूं कि यह व्यापक है! शेल स्क्रिप्ट उन साइड भाषाओं में से एक है, जिसे लोग सिर्फ अनौपचारिक रूप से सीखते हैं, और इसलिए मुझे लगता है कि हर कोई हमेशा LOCATION =cat /tmp/location.txt
जेसनस्मिथ

@jhs - मुझे स्पष्ट रूप से शेल स्क्रिप्ट में भाग्यशाली रहा है जो मुझे काम करना था!
ड्रेमन

4
"लोअरकेस अक्षर वाले पर्यावरण चर नामों का नाम अनुप्रयोगों के लिए आरक्षित है।" - POSIX IEEE Std 1003.1-2008 सेक्शन 8.1
18

5

वास्तव में, शब्द "पर्यावरण चर" काफी हाल के संयोग से प्रतीत होता है। 1984 में प्रकाशित उनकी क्लासिक पुस्तक "द यूनिक्स प्रोग्रामिंग एनवायरनमेंट" में केर्निघन और पाइक, केवल "शेल वेरिएबल्स" बोलते हैं - इंडेक्स में "पर्यावरण" के लिए एक प्रविष्टि भी नहीं है!


8
मुझे लगता है कि यह पुस्तक की एक चूक है। getenv (), setenv () और environ को UNIX संस्करण 7 (1979) में पेश किया गया था। en.wikipedia.org/wiki/Version_7_Unix
जुलियानो

3
यह पुस्तक इस बात पर ध्यान देती है कि ऊपरी मामले के चर का विशेष अर्थ है।
अस्वले

3

यह सिर्फ एक बहुत व्यापक रूप से आयोजित सम्मेलन है, मुझे संदेह है कि इसके लिए कोई "आधिकारिक" स्रोत है।


1

मैं पर्यावरण और वैश्विक चर दोनों के लिए ALL_CAPS का उपयोग करता हूं। बेशक, बैश में कोई वास्तविक चर गुंजाइश नहीं है, इसलिए ग्लोबल्स (ज्यादातर सेटिंग्स और स्टेट ट्रैकिंग) के रूप में उपयोग किए जाने वाले चर का एक अच्छा हिस्सा है, और अपेक्षाकृत कुछ 'लोकल' (काउंटरर्स, पुनरावृत्त, आंशिक रूप से निर्मित तार, और अस्थायी)


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