बैश प्रक्रिया प्रतिस्थापन का उपयोग करके, मैं एक साथ फाइल पर दो अलग-अलग आदेशों को चलाने के लिए चाहता हूं। इस उदाहरण में यह आवश्यक नहीं है लेकिन कल्पना करें कि "बिल्ली/usr/share/dict/words" एक बहुत महंगा ऑपरेशन था जैसे कि 50 जीबी फ़ाइल को असम्पीड्रेस करना।बैश प्रक्रिया प्रतिस्थापन और पूंछ के साथ गलत परिणाम?
cat /usr/share/dict/words | tee >(head -1 > h.txt) >(tail -1 > t.txt) > /dev/null
इस आदेश मैं h.txt शब्द की पहली पंक्ति को रोकने के लिए उम्मीद करेंगे दाखिल करने के बाद 'ए', और t.txt फ़ाइल "Zyzzogeton" की अंतिम पंक्ति को रोकने के लिए।
हालांकि वास्तव में क्या होता है यह है कि h.txt में "ए" होता है लेकिन t.txt में "Argillaceo" होता है जो फ़ाइल में लगभग 5% होता है।
ऐसा क्यों होता है? ऐसा लगता है कि या तो "पूंछ" प्रक्रिया जल्दी समाप्त हो रही है या धाराएं मिश्रित हो रही हैं।
इस तरह एक और इसी तरह कमान चल रहा है उम्मीद के रूप में व्यवहार:
cat /usr/share/dict/words | tee >(grep ^a > a.txt) >(grep ^z > z.txt) > /dev/null
इस आदेश मैं a.txt सभी शब्दों है कि "एक" से शुरू होते हैं करने के लिए उम्मीद थी के बाद, जबकि z.txt के सभी शामिल हैं शब्द जो "z" से शुरू होते हैं, जो वास्तव में हुआ था।
तो यह "पूंछ" के साथ क्यों काम नहीं करता है, और यह अन्य आदेशों के साथ यह काम नहीं करेगा?
मुझे लगता है कि इस http://stackoverflow.com से संबंधित है:
एक और hacky विकल्प शुरू कर तो जाने
head
प्रक्रिया सूची खत्म जब तक यह गैर शून्य लंबाई है नहीं से पहलेt.txt
को शून्य करने के लिए किया जाएगा/प्रश्न/448 9 339/बैश-प्रोसेस-प्रतिस्थापन-और-सिंकिंग जो बताती है कि बाहरी कमांड समाप्त होने पर प्रतिस्थापन निकास के साथ प्रक्रियाएं निकलती हैं, लेकिन स्पष्ट रूप से मैं यह प्रदर्शित करने में सक्षम नहीं हूं कि किसी भी आदेश के साथ वर्तमान समस्या है I मैंने अभी तक कोशिश की है –