POSIX गोले में, .
एक विशेष बिलिन है, इसलिए इसकी विफलता से शेल बाहर निकल जाता है (जैसे कुछ गोले में bash
, यह केवल तभी किया जाता है जब POSIX मोड में हो)।
एक त्रुटि के रूप में क्या योग्य है यह शेल पर निर्भर करता है। फ़ाइल पार्स करते समय उनमें से सभी एक सिंटैक्स त्रुटि पर बाहर नहीं निकलते हैं, लेकिन सबसे अधिक तब बाहर निकलेंगे जब खट्टा फ़ाइल नहीं मिल सकती है या खोला नहीं जा सकता है। मुझे किसी भी तरह का पता नहीं है, अगर गैर-शून्य निकास स्थिति (जब तक कि errexit
निश्चित रूप से विकल्प न हो ) के साथ वापस आने वाली खट्टी फाइल में अंतिम कमांड बाहर निकल जाएगी ।
यहाँ कर रहे हैं:
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
एक ऐसा मामला है जहां आप फ़ाइल को स्रोत करना चाहते हैं यदि यह वहां है, और नहीं तो यह नहीं है (या यहां खाली नहीं है -s
)।
यही है, इसे एक त्रुटि नहीं माना जाना चाहिए (POSIX गोले में घातक त्रुटि) यदि फ़ाइल नहीं है, तो उस फ़ाइल को एक वैकल्पिक फ़ाइल माना जाता है।
यदि फ़ाइल पठनीय नहीं थी या निर्देशिका (या कुछ गोले में) थी तो यह अभी भी एक (घातक) त्रुटि होगी यदि इसे पार्स करते समय एक सिंटैक्स त्रुटि हुई थी जो वास्तविक त्रुटि स्थिति होगी जिसे रिपोर्ट किया जाना चाहिए।
कुछ का तर्क होगा कि एक दौड़ की स्थिति है। लेकिन केवल एक चीज है तो इसका मतलब यह होगा कि खोल एक त्रुटि के साथ बाहर आ जाएंगे ताकि अगर फाइल के बीच में निकाल दिया जाता है [
और .
, लेकिन मैं इसे यह एक त्रुटि पर विचार करना है कि इस तय पथ फ़ाइल अचानक गायब हो जाएगा, जबकि स्क्रिप्ट है मान्य है का तर्क था चल रहा है।
दूसरी ओर,
command . "$NVM_DIR/nvm.sh" 2> /dev/null
जहां command कमांड के लिए विशेष विशेषता को command
हटाता है (इसलिए यह त्रुटि पर शेल से बाहर नहीं निकलता है) निम्नानुसार काम नहीं करेगा:.
- यह
.
त्रुटियों को छिपाएगा, लेकिन आदेशों की त्रुटियां खट्टी फाइल में भी चलेंगी
- यह गलत अनुमतियों वाली फ़ाइल की तरह वास्तविक त्रुटि शर्तों को भी छिपाएगा।
अन्य सामान्य वाक्यविन्यास (इनिट grep -r /etc/default /etc/init*
स्क्रिप्ट के लिए डेबियन सिस्टम पर उदाहरण के लिए देखें जो systemd
अभी तक परिवर्तित नहीं हुए हैं (जहां EnvironmentFile=-/etc/default/service
इसके बजाय वैकल्पिक पर्यावरण फ़ाइल निर्दिष्ट करने के लिए उपयोग किया जाता है) में शामिल हैं:
[ -e "$file" ] && . "$file"
यदि यह खाली है तो फ़ाइल को चेक करें, फिर भी इसे सोर्स करें। यदि यह खोला जा सकता है (तब भी, या वहाँ था) फिर भी घातक त्रुटि। आप अधिक प्रकार देख सकते हैं [ -f "$file" ]
( जैसे मौजूद है और एक नियमित फ़ाइल है), [ -r "$file" ]
(पठनीय है), या उन का संयोजन।
[ ! -e "$file" ] || . "$file"
थोड़ा बेहतर संस्करण। यह स्पष्ट करता है कि मौजूद फाइल ठीक नहीं है। इसका मतलब यह भी है कि $?
पिछले आदेश में $file
(पिछले मामले में, यदि आप प्राप्त करते हैं 1
, तो आप यह नहीं जानते हैं कि क्या यह $file
मौजूद नहीं था या यदि वह आदेश विफल हो गया है)
command . "$file"
फ़ाइल होने की अपेक्षा करें, लेकिन अगर यह व्याख्या नहीं की जा सकती है तो बाहर न निकलें।
[ ! -e "$file" ] || command . "$file"
उपरोक्त संयोजन: यह ठीक है यदि फ़ाइल नहीं है, और पॉसिक्स गोले के लिए, फ़ाइल खोलने (या पार्स) के लिए विफलताएं रिपोर्ट की गई हैं, लेकिन घातक नहीं हैं (जो अधिक वांछनीय हो सकता है ~/.profile
)।
However नोट: zsh
हालाँकि, आप command
उस तरह का उपयोग नहीं कर सकते जब तक कि sh
अनुकरण में; ध्यान दें कि कोर्न शेल में, source
वास्तव में command .
, एक गैर-विशेष संस्करण है.