लिनक्स पाइप प्रतीक "क्या करता है" | [डुप्लिकेट]


23

यहां एक कमांड है जो एक फ़ोल्डर में फाइलों को रिवर्स ऑर्डर में सॉर्ट करता है

ls | sort -r

|उस आदेश में प्रतीक क्या करता है?

क्या मैं वास्तव में यहाँ के लिए देख रहा हूँ लिनक्स शुरुआती के लिए पाइप के उच्च स्तर (समझने में आसान) की व्याख्या है। मैं सुपरसुसर पर यहां पाइप के बारे में अन्य प्रश्न देखता हूं, लेकिन ऐसा कुछ भी नहीं है जो एक उत्तर देता है जो सरल शब्दों में बताता है कि वे क्या करते हैं और वे पुनर्निर्देशन ( >या <प्रतीक) से कैसे भिन्न होते हैं ।


7
इसका लिनक्स से कोई लेना देना नहीं है (जो कर्नेल है)। सामान्य रूप से पाइप इनपुट / आउटपुट को फिर से निर्देशित करने का एक साधन है, शेल में जैसे बैश यह अलग नहीं है। केवल एक विशेष बात |यह है कि यह एक नाम का उपयोग नहीं करता है, एल-हैंड कमांड से आउटपुट सीधे पाइप के आर-हैंड पर कमांड के इनपुट के लिए पास किया जाता है।
एंडन एम। कोलमैन

विषय पर एक इतिहास-पाठ के लिए, linfo.org/pipe.html
फ्रेड्रिक

ls -1r(नोट नंबर एक तर्क) के समान परिणाम का उत्पादन करना चाहिए ls | sort -r
इवान चौ

मैं इसे इस तरह समझाना पसंद करता हूं: एक पाइप एक कमांड का आउटपुट लेता है और एक निम्न कमांड के लिए इसे उपयोगी बनाता है। उदाहरण के लिए, आप कर सकते हैं cat /somefile | grep cool। यह somefile का आउटपुट लेगा और इसे grep के लिए उपलब्ध कराएगा, और फिर grep इसमें कूल शब्द के साथ सभी लाइनों को प्रिंट करेगा।
जॉनडियोआ

जवाबों:


26

नए उपयोगकर्ताओं की मदद करने के लिए निम्नलिखित को थोड़ा सरल किया गया है।

ठीक है, सबसे पहले, मानक इनपुट और मानक आउटपुट की अवधारणा को समझना आवश्यक है।

लिनक्स और अन्य यूनिक्स जैसे ऑपरेटिंग सिस्टम में, प्रत्येक प्रक्रिया में एक मानक इनपुट ( stdin) और एक मानक आउटपुट ( stdout) होता है। सामान्य स्थिति यह है कि stdinआपका कीबोर्ड है और stdoutआपकी स्क्रीन या टर्मिनल विंडो है।

इसलिए जब आप दौड़ते हैं ls, तो यह आउटपुट पर फेंक देगा stdout। यदि आप कुछ और नहीं करते हैं, तो यह आपकी स्क्रीन या टर्मिनल विंडो पर जाएगा, और आप इसे देखेंगे।

अब, कुछ लिनक्स कमांड उपयोगकर्ता के साथ बातचीत करते हैं, और stdinऐसा करने के लिए, आपके टेक्स्ट एडिटर में से एक का उपयोग करते हैं। यह stdinआपके कीस्ट्रोक्स को स्वीकार करने, चीजों को करने और फिर सामान लिखने के लिए पढ़ता है stdout

हालांकि, गैर-संवादात्मक या "फ़िल्टर" कमांड भी हैं जो अंतःक्रियात्मक रूप से काम नहीं करते हैं, लेकिन डेटा का एक गुच्छा चाहते हैं। ये आज्ञाएँ सब कुछ ले लेंगी stdin, इसके लिए कुछ करेंगी , और फिर इसे फेंक देंगीstdout

चलो एक अन्य कमांड को देखते हैं du- जिसका उपयोग डिस्क उपयोग के लिए है। du /usr, उदाहरण के लिए, stdoutउस निर्देशिका में हर फ़ाइल की एक सूची ( किसी भी अन्य लिनक्स कमांड को पसंद करने के लिए) प्रिंट करेगा और इसका आकार होगा:

# du /usr
2312    /usr/games
124     /usr/lib/tc
692     /usr/lib/rygel-1.0
400     /usr/lib/apt/methods
40      /usr/lib/apt/solvers
444     /usr/lib/apt
6772    /usr/lib/gnash

जैसा कि आप बल्ले से सही बता सकते हैं, इसे क्रमबद्ध नहीं किया गया है, और आप चाहते हैं कि यह आकार के क्रम में क्रमबद्ध हो।

sortउन "फ़िल्टर" कमांडों में से एक है जो सामानों का एक गुच्छा लेगा stdinऔर इसे सॉर्ट करेगा।

तो, अगर हम ऐसा करते हैं:

# du /usr | sort -nr

हमें यह मिलता है, जो थोड़ा बेहतर है:

4213348 /usr
2070308 /usr/lib
1747764 /usr/share
583668  /usr/lib/vmware
501700  /usr/share/locale
366476  /usr/lib/x86_64-linux-gnu
318660  /usr/lib/libreoffice
295388  /usr/lib/vmware/modules
290376  /usr/lib/vmware/modules/binary
279056  /usr/lib/libreoffice/program
216980  /usr/share/icons

और अब आप देख सकते हैं कि "पाइप" stdoutएक कमांड को stdinदूसरे से जोड़ता है । आमतौर पर आप इसे इस तरह की स्थितियों में उपयोग करेंगे जहां आप किसी कमांड के आउटपुट को फ़िल्टर, सॉर्ट या अन्यथा हेरफेर करना चाहते हैं। यदि आप कई फ़िल्टर-प्रकार कमांड के माध्यम से आउटपुट को संसाधित करना चाहते हैं तो उन्हें कैस्केड किया जा सकता है।

यदि आप sortस्वयं टाइप करते हैं , तब भी यह पढ़ने की कोशिश करेगा stdin। चूंकि stdinआप अपने कीबोर्ड से जुड़े हुए हैं, यह आपके लिए कंट्रोल-डी प्रेस करने तक चीजों को टाइप करने और प्रोसेस करने के लिए इंतजार कर रहा होगा। यह आपको संकेत नहीं देगा क्योंकि यह वास्तव में अंतःक्रियात्मक रूप से उपयोग करने के लिए नहीं है।

एक कार्यक्रम के लिए यह बताना संभव है कि क्या stdinइंटरैक्टिव है या नहीं, इसलिए कुछ कार्यक्रम अलग-अलग कार्य कर सकते हैं यदि आप उन्हें स्वयं या पाइप के अंत में जारी करते हैं।

इसके अलावा, एक प्रोग्राम को पाइप करना जो केवल अंतःक्रियात्मक रूप से काम करता है, जैसे vi, आपके परिणामस्वरूप एक बुरा समय आएगा।

पाइप पुनर्निर्देशन से अलग होते हैं जिसमें डेटा को एक कमांड से दूसरे कमांड में कहीं भी स्टोर किए बिना शफ़ल किया जाता है। इसलिए, उपरोक्त उदाहरण में, duकहीं भी आउटपुट संग्रहीत नहीं है। अधिकांश समय आप पाइप के साथ ऐसा नहीं चाहते हैं क्योंकि पाइप का उपयोग करने का कारण किसी तरह से कमांड के आउटपुट को संसाधित करना है - लेकिन, एक आदेश teeहै जो आपको अपना केक देता है और इसे भी खा सकता है, यह होगा नकल यह क्या से प्राप्त करता है stdin, दोनों के लिए stdoutऔर अपने पसंद के फ़ाइल। आप यह भी bashकुछ आर्कन सिंटैक्स के साथ कर सकते हैं जिसमें एम्परसेंड और ब्रैकेट शामिल हैं जिनके बारे में मुझे नहीं पता है।


ध्यान दें कि यह लिनक्स, या यहां तक ​​कि POSIX के लिए अद्वितीय नहीं है। विंडोज पर अधिकांश (सभी?) गोले भी ऐसा करते हैं। और शायद अन्य OSes।
बॉब

मैं विंडोज की अवधारणा को जानता हूं stdinऔर stdoutयह लिनक्स के तहत विंडोज के तहत अलग है, हालांकि विंडोज cmd.exeया पॉवर्सशेल के दृष्टिकोण से बहुत अधिक नहीं है ।
लॉरेंस

मैं बहुत उत्सुक हूं कि यह कैसे अलग है - क्या आप समझाना चाहेंगे? हो सकता है कि चैट में अगर टिप्पणी इसके लिए एक अच्छी जगह नहीं है।
बॉब

1
Win32 प्रोग्राम में निश्चित रूप से एक मानक इनपुट और आउटपुट होता है। उदाहरण के लिए, आप Win32 फ़ंक्शन के साथ अपनी प्रक्रिया का मानक इनपुट, आउटपुट या त्रुटि हैंडल प्राप्त कर सकते हैं GetStdHandle()। यह .NET के साथ एक स्पॉन्ड [बच्चे] प्रक्रिया की मानक धाराओं को पुनर्निर्देशित करने के लिए भी तुच्छ है, जो मुझे विश्वास है कि नक्शे को Win32 फ़ंक्शन (लेकिन मैं 100% यकीन नहीं कर रहा हूं - मैं एक Win32 देव नहीं हूं)।
बॉब

1
आह, यहाँ Win32 समतुल्य है, के लिए STARTUPINFOसंरचना में उपयुक्त पैरामीटर सेट करके CreateProcess()
बॉब

27

यदि आप आउटपुट और इनपुट पुनर्निर्देशन के साथ सहज हैं, तो स्पष्टीकरण वास्तव में काफी आसान है।

Command1 | Command2

के रूप में ही करता है

Command1 > tempfile
Command2 < tempfile

लेकिन बिना tempfile। का आउटपुट Command1सीधे इनपुट से जुड़ा Command2होता है और ट्रांसफर मेमोरी में होता है।


मैं गलत हो सकता हूं, लेकिन मुझे लगता है कि पाइप सिंटैक्स में भी टेम्पोफाइल मौजूद है। यह सिर्फ एक नाम नहीं है।
तैमूर

3
नहीं, यह नहीं है। एक कमांड से दूसरे कमांड के इनपुट में आउटपुट पाइप करते समय कोई फाइल सिस्टम ऑपरेशन शामिल नहीं होता है।
डैनियल बी

1
हालांकि, डॉस (और सबसे अधिक संभावना विंडोज) के तहत, एक अस्थायी फ़ाइल है पाइप के द्वारा बनाई गई। नहीं * निक्स, लेकिन अंतर के लायक कुछ भी नहीं।
जेरेमी जे स्टारचेर

मुझे पूरा यकीन है कि यह सही नहीं है। प्रक्रिया मॉनिटर आपके दावे को वापस करने के लिए रिपोर्ट नहीं CreateFileया WriteFileकॉल करता है। / संपादित करें: यह विंडोज भाग के लिए है, बिल्कुल।
डैनियल बी

3

वास्तव में यदि आप जानना चाहते हैं कि पाइप क्या और> और | के बीच का अंतर है, तो बहुत सारी फाइलों के साथ एक निर्देशिका में जाएं, और

एक टर्मिनल ls बनाम ls | more (या डीआईआर और डीआईआर के साथ विंडोज से कर रहा है। अधिक)

यदि आपने> अधिक उपयोग किया है, तो यह 'अधिक' कमांड को ls के आउटपुट भेजने के बजाय 'अधिक' नामक एक फ़ाइल बनाता है। तो अगर किसी ने किया> अधिक शायद यह एक गलती है, तो कोई ऐसा नहीं करेगा> आप अधिक करेंगे> file1। अधिक एक प्रसिद्ध कमांड है।

एक कमांड से कमांड के बजाय <a> एक कमांड और फाइल को लिंक करने के लिए भी है। लेकिन जबकि> एक फ़ाइल के लिए कमांड का आउटपुट भेजता है, <एक फाइल को कमांड के इनपुट के रूप में भेजता है। मैं शायद ही कभी उपयोग करता हूं <जैसा कि मैं आमतौर पर बिल्ली file1 का उपयोग करता हूं किसी कमांड में फाइल का आउटपुट भेजने के लिए।

$ grep एक <file1 abc

$ बिल्ली file1 | grep एक एबीसी

2 पैरामीटर वाला grep grep पैटर्न फाइल का है। एक पैरामीटर के साथ grep grep पैटर्न है। और आप इसे फ़ाइल की सामग्री को पाइप करके, या <का उपयोग करके फ़ाइल भेज सकते हैं। यदि <का उपयोग कर रहे हैं, तो आप पहले कमांड का नाम लिखते हैं, फिर फ़ाइल नाम के बाद कमांड <फ़ाइल। अगर का उपयोग कर | किसी फ़ाइल की सामग्री को पाइप करने के लिए, आप cat file1 का उपयोग करें | आदेश।

कई कमांड भी फाइल को इनपुट के रूप में वैसे भी लेते हैं तो grep एक file1 काम करेगा, बिलकुल बिल्ली file1 की तरह | grep a, and grep a <file1।

मैं 15 साल पहले भी डॉस पर पाइप (!) और> कर रहा था।

संक्षेप में बताइए कैसे | <और> से भिन्न - पाइप 2 कमांड के बीच बैठता है <और> एक कमांड और एक फाइल के बीच बैठते हैं। > फ़ाइल में आउटपुट है। <फ़ाइल से इनपुट है।


3

पाइप चरित्र ( |) एक प्रोग्राम के आउटपुट को दूसरे के इनपुट से जोड़ता है।

इस उदाहरण echoमें शब्द प्रिंट करता है hello, और wc -cइसके इनपुट की एक वर्ण गणना करता है:

echo hello | wc -c

मुझे लगता है कि आपको एक बार कहना चाहिए कि गूंज "हैलो \ n" आउटपुट करेगी। आप ओपी को अध्ययन करने के लिए नहीं कह रहे हैं, आप इसे हर उस व्यक्ति को बता रहे हैं जो आपका उत्तर पढ़ता है। समय की यह बर्बादी क्यों?
रोड्रिगो

प्रतिक्रिया के लिए धन्यवाद, मैंने अपना उत्तर छोटा कर दिया।
bbaassssiiee

2

इसे समझने के लिए, इसे स्वयं आज़माएँ:

sort -r

अब आप एक कर्सर के साथ लटक रहे हैं, और यह कुछ भी नहीं कर रहा है। यदि आप कुछ डेटा में टाइप करते हैं तो क्या होता है?

1
2
3
5
4

अभी भी कुछ नहीं, है ना? अब ctrl + D दबाएं

5
4
3
2
1

तो यह किस प्रकार का है, यह इनपुट लेता है (आपने जो टाइप किया है), इसके साथ कुछ करता है (सॉर्ट) और इसे आउटपुट के रूप में वापस देता है। lsआदेश इनपुट नहीं ले करता है, यह केवल उत्पादन उत्पन्न करता है। पाइप प्रतीक आउटपुट से लेता है ls, और इसे sortकमांड के इनपुट के रूप में फीड करता है ।

>किसी प्रोग्राम में आउटपुट नहीं देता है, लेकिन आउटपुट को फाइल के रूप में संग्रहीत करता है। <इनपुट के रूप में एक फ़ाइल का उपयोग करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.