2011-06-06 14 views
5
unset v 
function f { 
    v=1 
} 
f | cat 
echo v=$v 
f 
echo v=$v 

क्यों पाइपिंग (किसी भी कमांड में) प्रिंटिंग 1 से पहले इको कमांड को रोकता है? दूसरा गूंज प्रिंट 1. मैं एक बैश खोल का उपयोग कर रहा हूँ। मैं इसे कॉपी/पेस्ट या इसे स्क्रिप्ट के रूप में चलाकर देख सकता हूं।बैश पाइपिंग वैश्विक चर असाइनमेंट को रोकता है

उत्तर

9

एक पाइपलाइन के सभी घटक (यदि एक से अधिक) को सबहेल में निष्पादित किया जाता है, और उनके परिवर्तनीय असाइनमेंट मुख्य खोल में नहीं रहते हैं।

इसका कारण यह है कि बैश वास्तविक मल्टीथ्रेडिंग (चर के साथ समवर्ती पहुंच के साथ) का समर्थन नहीं करता है, केवल समान प्रोसेसेस जो समानांतर में चलते हैं।


कैसे से बचने के लिए इस:

आप मुख्य बैश प्रक्रिया में बनाए रखने के लिए (या उन्हें वहाँ हस्तांतरण करने के लिए कुछ रास्ता मिल) चाहते हैं किसी भी चर कार्य करना है। ऐसा करने का बैश तरह से एक पाइप का उपयोग नहीं किया जाएगा, लेकिन इसके बजाय उपयोग प्रक्रिया प्रतिस्थापन:

f > >(cat) 
बेशक

, इस यदि आप एक पाइप के दोनों प्रक्रियाओं में चर कार्य करने की जरूरत है मदद नहीं करेगा। तो आपको इसके बजाय बेहतर तंत्र के बारे में सोचना होगा (शायद कॉप्रोसेसेस, और कहीं भी चर का आउटपुट?)

+1

असल में, यह एक पाइप * के सभी तत्वों पर लागू होता है * अंतिम * सहित। –

+0

हम्म, अजीब ... मुझे गलत इंप्रेशन कहाँ मिला? धन्यवाद, मैंने इसे बदल दिया। –

+1

ŭlo: कुछ गोले (ksh और zsh मुझे लगता है, लेकिन बाश नहीं) मुख्य खोल प्रक्रिया में पाइपलाइन का अंतिम तत्व चलाते हैं। – camh

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