क्या मुझे अपनी सभी लिपियों पर * .sh और * .rb फाइल एक्सटेंशन लगाना चाहिए?


20

मेरे पास मेरे $ HOME / बिन डायरेक्टरी में हाथ से लुढ़कने योग्य स्क्रिप्ट का एक गुच्छा है। कुछ बैश में लिखे गए हैं, कुछ रूबी में। उन सभी के पास शीर्ष पर शेलबैंग लाइन है, जो शेल को बताती है कि किस दुभाषिया का उपयोग करना है (मेरे मामले में रूबी या रूबी)।

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

वर्तमान में, इन लिपियों में बिना किसी फ़ाइल एक्सटेंशन के सरल नाम हैं।

सबसे अच्छा अभ्यास क्या है?


1
शेबंग से विस्तार और एक साधारण स्क्रिप्ट के साथ वापस करना काफी आसान है। इसलिए एक कोशिश करें और बाद में ठीक करें अगर आपको जरूरत है।
एरोन जे लैंग

जवाबों:


9

आप वाइल्डकार्ड आदेशों की तरह कर सकते हैं ls *.rbया cp *.shआप भविष्य में अपनी स्क्रिप्ट का आयोजन करना चाहते हैं।

मेरी राय में जल्दी या पछतावा शुरू करें।

संपादकों जैसे vimकि शेबंग या फ़ाइल एक्सटेंशन के आधार पर सही सिंटैक्स हाइलाइटिंग लागू करने में सक्षम होंगे ।

यह भी विभिन्न संपादकों में मॉडल का उपयोग करके पूरा किया जा सकता है। विम के लिए:

# vim: ft=sh

2
IMHO, संगठन बेहतर कार्य करता है, कार्यान्वयन के विवरण द्वारा नहीं।
ग्रेविटी

4
@grawity: फिर भी प्रत्यय कुटिया के लिए grepping से सरल द्वारा आयोजित कर रहा है ...
अकीरा

हालांकि मैं ग्लोब कारण से सहमत हूं, ज्यादातर संपादक फिलैटाइप निर्धारित करने के लिए शेबंग पढ़ने के लिए पर्याप्त स्मार्ट हैं।
रिच होमोलका

10

अच्छी तरह से - जीवन में ज्यादातर चीजें: यह आपकी आवश्यकताओं पर निर्भर करता है।

आपने कहा कि ये स्क्रिप्ट एक बिन-निर्देशिका में रहती हैं और मैं मानता हूं कि इन लिपियों को कमांड लाइन से बुलाया जाना है। उपयोगकर्ता के रूप में मैं इसे कष्टप्रद मानता हूं यदि मुझे bla.ksh या foo.bash टाइप करना है। इसके अलावा, यदि सांकेतिक शब्दों में बदलनेवाला दुभाषिया आदेश नाम भी बदल जाएगा annother को स्थानांतरित करने के लिए फैसला करता है और मैं अन्य लिपियों में संशोधन करने का है कि इन उपकरणों के मेकअप उपयोग होता है - बहुत कष्टप्रद है, भले ही उपयोगकर्ता और सांकेतिक शब्दों में बदलनेवाला बहुत ही व्यक्ति हैं।

लेकिन दूसरी तरफ मैं अपने प्रोजेक्ट बिल्ड निर्देशिका में .sh या .tcl जैसे एक्सटेंशन का उपयोग करता हूं। इस तरह मैं फ़ाइलों को उनके गंतव्य निर्देशिकाओं में तैनात करने के लिए मेक फीचर्स का उपयोग कर सकता हूं - लेकिन इस स्तर पर मैं फ़ाइल प्रत्यय हटा देता हूं।


6

स्पष्ट रूप से binनिर्देशिकाओं में निष्पादन योग्य फ़ाइलों और संपादन योग्य "स्रोत" फ़ाइलों के बीच कुछ अंतर हैं ।

  • स्रोत फ़ाइलों के लिए, यह एक प्रत्यय होने के लिए सहायक है ताकि आप देख सकें कि क्या है, और कुछ कम-बुद्धिमान उपकरण मदद करने के लिए जो #!लाइन को स्कैन करने में विफल रहते हैं ।
  • मॉड्यूल के लिए, वे केवल कार्यक्रम, जिनमें से सभी समान दुभाषिया (या कोई दुभाषिया) का उपयोग के संबंधित सेट द्वारा इस्तेमाल कर रहे हैं, और यह शामिल करने के लिए पारंपरिक है .pm, .shया .soइस तरह के मामलों में।
  • निष्पादन योग्य कार्यक्रमों के लिए, इसका नाम "प्रोग्रामिंग अनुबंध" का हिस्सा है जिसके द्वारा उपयोगकर्ता और अन्य स्क्रिप्ट इसे लागू करते हैं। यह महत्वपूर्ण है कि यदि कार्यान्वयन करता है तो भी नाम नहीं बदलता है; तो स्पष्ट रूप से फ़ाइल नाम में एक प्रत्यय नहीं होना चाहिए

संकलित कार्यक्रम के मामले में, "स्रोत" और "निष्पादन योग्य" के बीच का अंतर स्पष्ट है: एक में स्रोत कोड होता है, दूसरे में मशीन की भाषा होती है या बाइटेकोड की व्याख्या होती है। स्क्रिप्ट के मामले में, कोई स्पष्ट अंतर नहीं है, लेकिन makeकमांड "स्क्रिप्ट के लिए स्रोत कोड" और "स्क्रिप्ट का निष्पादन योग्य संस्करण": "शेल स्क्रिप्ट" के लिए इसका डिफ़ॉल्ट "संकलक" बस के बीच एक अलग जुदाई बनाए रखता है cp

मैं एक अलग $HOME/sourceनिर्देशिका रखने की सलाह दूंगा , और या तो:

  • एक सिमलिंक रखना, जैसे कि द्वारा बनाया गया ln -s ../source/foo.sh $HOME/bin/foo; या
  • का उपयोग करके परिवर्तन (और उन्हें परीक्षण) करने के बाद मैन्युअल रूप से कॉपी करें install -m 755 foo.sh ../bin/foo; या
  • Makefileस्रोत फ़ाइल को अंदर से कॉपी करने से पहले एक सिंटैक्स चेक करने के लिए एक नियम का उपयोग $HOME/sourceकरना$HOME/bin

फुटनोट: एक शेल स्क्रिप्ट मॉड्यूल केवल एक अन्य शेल स्क्रिप्ट द्वारा प्रयोग करने योग्य है, और उस स्क्रिप्ट के आंतरिक संदर्भ को संशोधित .या sourceनिर्मित कमांड का उपयोग करता है । यह एक निष्पादन योग्य स्क्रिप्ट से अलग है, जो (किसी भी कार्यक्रम की तरह) एक अलग प्रक्रिया के रूप में चलती है और इसकी मूल प्रक्रिया को संशोधित नहीं कर सकती है। एक मोटे सम्मेलन के रूप में, मॉड्यूल अंदर जाते हैं /usr/lib/name_of_program/name_of_module.shजबकि कमांड /usr/bin/name_of_command(बिना किसी प्रत्यय के) अंदर जाते हैं।


3

यह आवश्यक नहीं है। कर्नेल को पहले से ही सही व्याख्याकार ( #!लाइन द्वारा ) का उपयोग करने की सूचना है , और सभी लोकप्रिय पाठ संपादकों ने इसे भी पढ़ा है, इसलिए एक एक्सटेंशन जोड़ने से कुछ भी उपयोगी नहीं होगा, केवल टाइपिंग में वृद्धि होगी। एक निष्पादन योग्य कार्यक्रम का एकमात्र समय एक एक्सटेंशन होता है, जब यह किसी तरह महत्वपूर्ण होता है (प्रोग्राम या उपयोगकर्ता या दोनों के लिए)।


दूसरी ओर, मॉड्यूल और पुस्तकालय, लगभग हमेशा एक्सटेंशन होते हैं ( .rbरूबी मॉड्यूल के लिए, .soईएलएफ साझा पुस्तकालयों के लिए, और इसी तरह)।


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