2012-08-11 18 views
37

मैं एकाधिक कमांड के stdout को एक कमांड में कैसे पाइप कर सकता हूं?पाइप एकाधिक कमांड को एक ही कमांड में

उदाहरण 1: गठबंधन और सभी तीन गूंज आदेशों के उत्पादन क्रमबद्ध करें:

echo zzz; echo aaa; echo kkk 

वांछित आउटपुट:

aaa 
kkk 
zzz 

उदाहरण 2: पुनर्लेखन तो निम्नलिखित है कि सभी आदेशों के लिए एक एकल में हैं कमांड लाइन पाइप का उपयोग कर, एक अस्थायी फ़ाइल के लिए रीडायरेक्ट रहित:

setopt > /tmp/foo; unsetopt >> /tmp/foo; set >> /tmp/foo; sort /tmp/foo 

उत्तर

66

उपयोग कोष्ठक() के लिए आदेशों को एक ही प्रक्रिया में संयोजित करें, जो उनमें से प्रत्येक के stdout को जोड़ देगा।

उदाहरण 1 (ध्यान दें कि $ सुरक्षा प्रॉम्प्ट है):

$ (echo zzz; echo aaa; echo kkk) | sort 
aaa 
kkk 
zzz 


उदाहरण 2:

(setopt; unsetopt; set) | sort 
+12

+1। आप ब्रेसिज़ का भी उपयोग कर सकते हैं जो एक सबहेल नहीं पैदा करता है। वाक्यविन्यास थोड़ा और सख्त है: '{setopt; unsetopt; सेट; } | सॉर्ट | कम '- ब्रेसिज़ और पिछली अर्धविराम के चारों ओर सफेद जगह की आवश्यकता होती है। –

+6

@glenn: इससे कोई फर्क नहीं पड़ता (बैश 3.2.48 में परीक्षण किया गया है), क्योंकि पाइपलाइन इसे किसी भी तरह से सबहेल में डाल देती है। –

+1

यह ध्यान दिया जाना चाहिए कि '$ 'संकेत है, कमांड – Gilly

0

Windows में यह इस प्रकार होगा: (echo zzz & echo aaa & echo kkk) | sort

या यदि यह एक बैच फ़ाइल के अंदर है, यह मोनो लाइन (नमूना की तरह) के साथ-साथ मल्टीलाइन भी हो सकता है:

(
echo zzz 
echo aaa 
echo kkk 
) | sort 

नोट: मूल पोस्ट यह उल्लेख नहीं है केवल लिनक्स के लिए है, इसलिए मैं विंडोज कमांड लाइन के लिए समाधान जोड़ा ... यह बहुत उपयोगी है जब स्क्रिप्ट के अंदर diskpart (echo diskpart_command) के साथ VHD/VHDX के साथ काम करने के बजाय उसी पर गूंज की, लेकिन वहां echo दें, echos के बिना और > रीडायरेक्टर के साथ एक और तरीका भी है, लेकिन यह त्रुटियों के लिए बहुत प्रवण है और लिखने के लिए और अधिक जटिल है (यदि मौजूद है तो त्रुटियों के जटिल प्रवण का उपयोग क्यों करें सरल तरीका है कि सभी तरह से अच्छी तरह से काम करते हैं) ... याद रखें %d% आपको वास्तविक पथ देता है (वीएचडी/वीएचडीएक्स फाइलों के पथ को हार्डकोड करने के लिए बहुत उपयोगी)।

7

आप इस के लिए {} का उपयोग और इतने तरह (list) में एक उप-खोल की आवश्यकता को समाप्त, कर सकते हैं:

{ echo zzz; echo aaa; echo kkk; } | sort 

हम { के बाद और } से पहले एक खाली स्थान के चरित्र की जरूरत है। जब अनुक्रम एक पंक्ति पर लिखा जाता है तो हमें अंतिम ; की भी आवश्यकता होती है।

हम भी किसी भी ; की आवश्यकता के बिना एकाधिक पंक्तियों में यह लिख सकते हैं:

उदाहरण 1:

{ 
    echo zzz 
    echo aaa 
    echo kkk 
} | sort 

उदाहरण 2:

{ 
    setopt 
    unsetopt 
    set 
} | sort