2012-11-15 11 views
7

क्या यह अच्छा खोल प्रोग्रामिंग अभ्यास है जब भी संभव हो केवल पढ़ने योग्य चर का उपयोग करने के लिए या क्या इसमें कोई कमी है? जैसे अगर मैं, कुछ स्क्रिप्ट है कि अपरिवर्तनीय फ़ाइल पथ का उपयोग करने के कई स्क्रिप्ट फ़ाइलें के होते हैं लिखने के लिए यह मतलब होता है कि जैसे रास्तों घोषित करने के लिए चाहता था:शैल स्क्रिप्ट्स में पढ़ने-योग्य चर का उपयोग

readonly LOGS 
export LOGS 
LOGS="/some/path" 

एक और सवाल: यह एक अच्छा विचार अखंड विभाजित करने के लिए है और अलग फाइलों में शेल स्क्रिप्ट कोड भी थकाऊ पढ़ा? आपके उत्तरों के लिए बहुत धन्यवाद।

+1

अब तक, मैंने कोई प्रोग्रामिंग अभ्यास नहीं किया है जो कि कोई भी बाशवाद नहीं देखा है। यदि आप स्वच्छ खोल स्क्रिप्टिंग सीखना चाहते हैं, तो सादा 'sh' के साथ रहें। इस तरह से आसानी से नहीं किया जा सकता है, न तो बाश के साथ किया जाना चाहिए। –

+0

सुरक्षा उद्देश्यों के लिए केवल वेरिएबल्स उपयोगी हो सकते हैं। यह देखने के लिए, कमांड लाइन पर एक रीडोनली वैरिएबल सेट करें और फिर इसे बदलने का प्रयास करना कितना मुश्किल है - पिछली बार मैंने जांच की है कि आपको डिबगर के साथ बैश हैक करना होगा (उदाहरण के लिए 'gbd संलग्न ') केवल पढ़ने योग्य चर बदलें। –

+0

@ ए डैनिसचेस्की - या बस एक नई खोल प्रक्रिया शुरू करें। –

उत्तर

11

ऐसा लगता है कि आप सोच सकते हैं कि readonly यह की तुलना में अधिक होता है वास्तव में करता है एक बात के लिए, पढ़ने की स्थिति को पर्यावरण में निर्यात नहीं किया जाता है या बाल प्रक्रियाओं द्वारा विरासत में प्राप्त नहीं किया जाता है:

$ declare -rx LOGS=hello 
$ LOGS=goodbye 
bash: LOGS: readonly variable 
$ bash -c 'echo "$LOGS"' 
hello 
$ bash -c 'LOGS=goodbye; echo "$LOGS"' 
goodbye 
$ 
+0

उत्कृष्ट बिंदु, लेकिन कोई भी आसानी से "।" का उपयोग कर काम कर सकता है। स्क्रिप्ट को बाल प्रक्रिया के रूप में बुलाए जाने के बजाय। – figtrap

4

आम तौर पर केवल पढ़ने वाले चर (किसी भी भाषा में) का उपयोग करके और अपने प्रोग्राम (किसी भी भाषा में) को मॉड्यूलर करना एक अच्छी बात है।

केवल वैरिएबल को बग के एक सामान्य स्रोत के खिलाफ सुरक्षित रखें, और पठनीयता और रखरखाव में सुधार करने में मदद करता है। यह जानकर कि आप एक चर के मूल्य पर भरोसा कर सकते हैं, आपको अपने प्रोग्राम के बारे में बेहतर कारण बनने में सक्षम बनाता है, और बाद में उस चर के बारे में धारणाएं करने के लिए सक्षम करता है - यदि वेरिएबल परिवर्तनीय थे तो आप ऐसा नहीं कर सकते थे।

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

3

मुझे नहीं लगता कि बैश में केवल पढ़ने योग्य चर उपयोगी हैं। मैं किसी भी मुद्दे के बारे में नहीं सोच सकता जिसे मैंने देखा है जिसे एक परिवर्तनीय रीडोनली बनाकर रोका जा सकता था। ऐसी सीमाएं बैश की गतिशील प्रकृति के खिलाफ जाती हैं। मुद्दों के अन्य सामान्य कारण हैं (जैसे गलत वर्तनी या स्थानीय रूप में चर घोषित करना भूलना) जो किसी भी तरह से रोकने के लिए असंभव हैं।

यदि आप चीजों को विभाजित करना चाहते हैं तो केवल "फ़ंक्शंस" को विभाजित करने का प्रयास करें, न केवल कोड के टुकड़े। यदि आपको पता है कि "स्रोत ~/myscript.sh" वास्तव में कुछ भी नहीं करता है तो एक छोटी सी चीज का पुन: उपयोग करना आसान है।

+1

धन्यवाद। लेकिन केवल पढ़ने योग्य चर के पास कोई नुकसान नहीं है, क्या वे करते हैं? – user1812379

+3

वास्तव में केवल पढ़ने योग्य चर के मूल्य हैं। यदि आप स्क्रिप्ट के दसियों को बनाए रखते हैं जो क्रॉस सोर्स किए जाते हैं तो एक वैरिएबल को अपरिवर्तनीय के रूप में चिह्नित करना बहुत समझ में आता है!जैसा कि @ मार्ककिड ने उल्लेख किया है कि वे वास्तव में अपरिवर्तनीय नहीं हैं, लेकिन जब कोई और आपके "सामान" को पढ़ना शुरू कर देता है तो उनके पास यह इरादा होगा कि यह चर बदलने के लिए नहीं है! यह वास्तव में उपयोगी है और स्क्रिप्ट को और अधिक पठनीय बनाता है। मुझे सच में विश्वास है कि वैश्विक चर में एक राज्य साझा करना एक भयानक अभ्यास है, लेकिन जैसा कि हम सभी जानते हैं कि बैश किसी भी मन में इस के साथ डिज़ाइन नहीं किया गया है। – egelev

4

केवल पढ़ने योग्य चर का क्लासिक उपयोग TMOUT के साथ है। इस चर को गैर-शून्य मान पर सेट करना TMOUT निष्क्रियता के सेकंड (यानी कोई कीबोर्ड इनपुट नहीं) के बाद एक इंटरैक्टिव टर्मिनल सत्र लॉगआउट करेगा। सेटिंग अधिभावी से एक स्मार्ट उपयोगकर्ता को हराने के लिए, readonly का उपयोग करें:

readonly TMOUT=60 

यह किया है, वहाँ ऐसा करने के लिए कोई रास्ता नहीं है:

export TMOUT=0 
+0

आसानी से 'exec bash' के साथ काम किया। 'टीएनओयूटी' को फिर से सेट करने के लिए जरूरी होने पर '--norc' के साथ। –

संबंधित मुद्दे