हां गोले, और bash
विशेष रूप से, एक समय में फ़ाइल को एक पंक्ति पढ़ने के लिए सावधान किया जाता है, इसलिए यह उसी तरह काम करता है जब आप इसे अंतःक्रियात्मक रूप से उपयोग करते हैं।
आप देखेंगे कि जब फ़ाइल खोज योग्य नहीं है (जैसे कि पाइप), bash
यहां तक कि एक बार में एक बाइट पढ़ता है , तो यह सुनिश्चित करें कि \n
चरित्र को अतीत में न पढ़ें । जब फ़ाइल खोजी जा सकती है, तो यह एक बार में पूर्ण ब्लॉक पढ़कर अनुकूलित करता है, लेकिन बाद में वापस आ जाता है \n
।
इसका मतलब है कि आप इस तरह की चीजें कर सकते हैं:
bash << \EOF
read var
var's content
echo "$var"
EOF
या खुद को अपडेट करने वाली स्क्रिप्ट लिखें। यदि आप उस गारंटी को नहीं देते हैं तो आप ऐसा नहीं कर पाएंगे।
अब, यह दुर्लभ है कि आप उस तरह की चीजें करना चाहते हैं और, जैसा कि आपको पता चला है, यह सुविधा उस तरीके से प्राप्त करने के लिए अधिक बार उपयोगी होती है।
इससे बचने के लिए, आप कोशिश कर सकते हैं और सुनिश्चित करें कि आप फ़ाइल को इन-प्लेस (उदाहरण के लिए, कॉपी को संशोधित करें, और कॉपी को जगह में स्थानांतरित न करें (जैसे sed -i
या perl -pi
कुछ संपादक उदाहरण के लिए करते हैं)।
या आप अपनी स्क्रिप्ट लिख सकते हैं जैसे:
{
sleep 20
echo test
}; exit
(ध्यान दें कि यह महत्वपूर्ण है कि एक exit
ही पंक्ति के रूप में हो }
; हालांकि आप इसे बंद करने से ठीक पहले ब्रेसिज़ के अंदर भी डाल सकते हैं)।
या:
main() {
sleep 20
echo test
}
main "$@"; exit
शेल को exit
कुछ भी करने से पहले स्क्रिप्ट को पढ़ने तक की आवश्यकता होगी । यह सुनिश्चित करता है कि शेल स्क्रिप्ट से दोबारा नहीं पढ़ा जाएगा।
इसका मतलब है कि पूरी स्क्रिप्ट को स्मृति में संग्रहीत किया जाएगा।
यह स्क्रिप्ट के पार्सिंग को भी प्रभावित कर सकता है।
उदाहरण के लिए, इसमें bash
:
export LC_ALL=fr_FR.UTF-8
echo $'St\ue9phane'
यूटीएफ -8 में यू + 00E9 एन्कोडेड आउटपुट करेगा। हालाँकि, यदि आप इसे इसमें बदलते हैं:
{
export LC_ALL=fr_FR.UTF-8
echo $'St\ue9phane'
}
\ue9
चारसेट उस समय प्रभाव में था कि आदेश पार्स किया गया था इस मामले में है, जिसमें विस्तार किया जाएगा से पहलेexport
आदेश निष्पादित किया जाता है।
यह भी ध्यान दें कि यदि source
उर्फ .
कमांड का उपयोग कुछ गोले के साथ किया जाता है, तो आपको खट्टी फाइलों के लिए एक ही तरह की समस्या होगी।
bash
हालांकि यह ऐसा नहीं है जिसकी source
कमान इंटरप्रिट करने से पहले फाइल को पूरी तरह से पढ़ ले। यदि bash
विशेष रूप से लेखन के लिए , आप वास्तव में स्क्रिप्ट के प्रारंभ में जोड़कर, इसका उपयोग कर सकते हैं:
if [[ ! $already_sourced ]]; then
already_sourced=1
source "$0"; exit
fi
(मैं उस पर भरोसा नहीं करूंगा, हालांकि जैसा कि आप भविष्य के संस्करणों की कल्पना bash
कर सकते हैं, उस व्यवहार को बदल सकते हैं जिसे वर्तमान में एक सीमा के रूप में देखा जा सकता है (bash और AT & T ksh केवल POSIX जैसे गोले हैं जो इस तरह का व्यवहार करते हैं, जहां तक वे बता सकते हैं) और already_sourced
चाल थोड़ी भंगुर है क्योंकि यह मानता है कि चर वातावरण में नहीं है, यह उल्लेख नहीं है कि यह BASH_SOURCE चर की सामग्री को प्रभावित करता है)