जवाबों:
यदि आप अपने वर्तमान शेल को प्रभावित करने के लिए कमांड सूची के साइड-इफेक्ट्स चाहते हैं , तो उपयोग करें {...}
यदि आप कोई साइड-इफेक्ट्स को छोड़ना चाहते हैं, तो उपयोग करें(...)
उदाहरण के लिए, अगर मैं:
$IFS
कुछ आदेशों के लिए परिवर्तन करना चाहते हैं , लेकिन मैं $IFS
वर्तमान शेल के लिए विश्व स्तर पर परिवर्तन नहीं करना चाहताcd
कहीं, लेकिन मैं $PWD
वर्तमान शेल के लिए बदलना नहीं चाहतायह ध्यान देने योग्य है कि कोष्ठक का उपयोग फ़ंक्शन परिभाषा में किया जा सकता है:
सामान्य उपयोग: ब्रेसिज़: फ़ंक्शन बॉडी वर्तमान शेल में निष्पादित होती है; फंक्शन पूरा होने के बाद साइड-इफेक्ट्स रहते हैं
$ count_tmp() { cd /tmp; files=(*); echo "${#files[@]}"; }
$ pwd; count_tmp; pwd
/home/jackman
11
/tmp
$ echo "${#files[@]}"
11
असामान्य उपयोग: कोष्ठक: एक उपधारा में फ़ंक्शन बॉडी निष्पादित होती है; साइड-इफ़ेक्ट तब गायब हो जाते हैं जब सबस्क्रिप्शन बाहर निकल जाता है
$ cd ; unset files
$ count_tmp() (cd /tmp; files=(*); echo "${#files[@]}")
$ pwd; count_tmp; pwd
/home/jackman
11
/home/jackman
$ echo "${#files[@]}"
0
local
कीवर्ड का उपयोग करने से उस प्रदूषण को साफ करने में काफी मदद मिलती है।
pwd; (count_tmp); pwd;
आधिकारिक बैश प्रलेखन से :
()
( list )
कोष्ठक के बीच आदेशों की एक सूची रखने से एक उप-वातावरण का निर्माण होता है, और सूची के प्रत्येक आदेशों को उस उपधारा में निष्पादित किया जाता है। चूंकि सूची को एक सबशेल में निष्पादित किया जाता है, इसलिए सबहेल पूरा होने के बाद चर असाइनमेंट प्रभाव में नहीं रहते हैं।
{}
{ list; }
घुंघराले ब्रेसिज़ के बीच आदेशों की एक सूची रखने से सूची को वर्तमान शेल संदर्भ में निष्पादित किया जा सकता है। कोई सबस्क्रिप्शन नहीं बनाया जाता है। सूची के बाद अर्धविराम (या नई पंक्ति) की आवश्यकता है।
Thread {} ’में कोड को वर्तमान थ्रेड / प्रक्रिया / वातावरण में निष्पादित किया जाता है और परिवर्तनों को संरक्षित किया जाता है, इसे अधिक संक्षिप्त रूप से डालने के लिए, कोड को वर्तमान दायरे में चलाया जाता है।
कोड इन '()' को अलग-अलग बैश की बाल प्रक्रिया के अंदर चलाया जाता है, जिसे निष्पादन के बाद छोड़ दिया जाता है। इस बच्चे की प्रक्रिया को अक्सर उप-शेल के रूप में संदर्भित किया जाता है और इसे एक नए, बच्चे जैसी गुंजाइश के रूप में सोचा जा सकता है।
एक उदाहरण के रूप में निम्नलिखित पर विचार करें ...
~ # { test_var=test }
~ # echo $test_var
test
~ # ( test_var2=test2 )
~ # echo $test_var2
~ #
'{}' के साथ पहले उदाहरण में सूचना '' '' को बंद करने के बाद भी परिवर्तनशील है, जबकि '()' के उदाहरण में चर '()' के दायरे से बाहर सेट नहीं है।
(...)
उप-शेल में कोड चलाने के लिए उपयोग किया जाता है। उपयोग किए जाने वाले कोड को {...}
उप-शेल में उपयोग नहीं किया जाएगा।