#!/bin/sh
echo "hello world" | read var1 var2
echo $var1
echo $var2
क्योंकि पाइपलाइनों एक subshell अंदर उनके घटकों के बारे में चलाने के लिए कोई उत्पादन पैदा करता है। सब्सक्रिप्ल्स माता-पिता शैल के चर के प्रति प्रतियों को प्रतिस्थापित करने के बजाय प्रतियां प्राप्त करते हैं। इस प्रयास करें:
#!/bin/sh
foo="contents of shell variable foo"
echo $foo
(
echo $foo
foo="foo contents modified"
echo $foo
)
echo $foo
कोष्ठक है कि एक subshell में चला जाता है कोड का एक क्षेत्र को परिभाषित, और $ foo उन्हें अंदर संशोधित किए जाने के बाद अपने मूल मूल्य बरकरार रखती है।
अब इस प्रयास करें:
#!/bin/sh
foo="contents of shell variable foo"
echo $foo
{
echo $foo
foo="foo contents modified"
echo $foo
}
echo $foo
ब्रेसिज़ समूह के लिए विशुद्ध रूप से कर रहे हैं, कोई subshell बनाई गई है, और $ foo ब्रेसिज़ के अंदर संशोधित एक ही $ foo उन्हें बाहर संशोधित है।
अब इस प्रयास करें:
#!/bin/sh
echo "hello world" | {
read var1 var2
echo $var1
echo $var2
}
echo $var1
echo $var2
ब्रेसिज़ के अंदर, पढ़ने builtin $ var1 और $ var2 ठीक से पैदा करता है और जैसा कि आप देख सकते हैं कि वे गूँजती मिलता है। ब्रेसिज़ के बाहर, वे अब और मौजूद नहीं हैं। ब्रेसिज़ के भीतर सभी कोड को सबहेल में चलाया गया है क्योंकि यह पाइपलाइन का एक घटक है।
आप ब्रेसिज़ के बीच कोड की मनमानी मात्रा डाल सकते हैं, ताकि आप इस पाइपिंग-इन-ए-ब्लॉक निर्माण का उपयोग कर सकें जब भी आपको शेल स्क्रिप्ट का एक ब्लॉक चलाने की आवश्यकता होती है जो किसी और चीज के आउटपुट को पार करती है।
यह खोल की पसंद पर निर्भर करता है। Ksh93 प्रक्रिया ओवरहेड को सीमित करने के लिए डिज़ाइन किया गया था।यह एक पाइपलाइन * अंदर * invoking खोल प्रक्रिया के अंतिम तत्व भी चलाता है, जिससे राज्य को संरक्षित किया जाता है। –
बैश 4.2 ने एक ही काम करने का विकल्प पेश किया। नौकरी नियंत्रण बंद करें ('सेट + एम') और' lastpipe' विकल्प ('shopt -s lastpipe') सेट करें। – chepner
मैं उसमें देख लूंगा। धन्यवाद! –