समझ कैसे बाश में पाइपों को इनपुट भेजे जाते हैं


17

मुझे समझ में नहीं आया कि कैसे पाइप बाश में काम करते हैं।

मुझे पता है कि यह एक कमांड से दूसरे कमांड में इनपुट के रूप में आउटपुट लेता है।

आउटपुट क्या है मैं प्राप्त कर सकता हूं क्योंकि यह वही है जो कमांड स्क्रीन पर प्रिंट करता है।

लेकिन मुझे कैसे पता चलेगा कि एक कमांड क्या इनपुट लेगा?

यहाँ एक उदाहरण है जो मुझे लगा कि काम करेगा:

which gem | rm

दुर्भाग्य से यह नहीं था।

कौन सा रत्न प्रिंट करता है /usr/bin/gemताकि आउटपुट सही होना चाहिए?

मैंने सोचा था कि आरएम को दिया गया था इसलिए यह जोर से हुआ rm /usr/bin/gemलेकिन मैं गलत था।

तो मेरा सवाल है, मुझे कैसे पता चलेगा कि एक कमांड क्या इनपुट लेता है?


2
कुछ और के अलावा, rm /usr/bin/gemएक भयानक विचार है। छोड़ें कि gem(और रूबी दुभाषिया इसके साथ चला जाता है) अकेले और अपने पसंदीदा रूबी दुभाषिया (और gem) का उपयोग कर स्थापित करें rvm: rvm.beginrescueend.com
Telemachus

जवाबों:


23

"इनपुट" और "कमांड लाइन तर्क" अलग-अलग चीजें हैं।

rm तर्कों के रूप में प्रदान की गई फ़ाइलों को हटा देता है।

एक पाइप बाएं हाथ की कमान के आउटपुट को दाएं हाथ की कमांड के इनपुट पर पुनर्निर्देशित करता है। यह प्रोग्राम के कमांड लाइन तर्कों को दाईं ओर प्रभावित नहीं करता है।

आप जो करने की कोशिश कर रहे हैं, उसे xargsकरने के लिए मानक इनपुट को प्रोग्राम को निष्पादित करने के लिए कमांड-लाइन तर्कों में परिवर्तित करने का प्रयास करें । यही इसका काम है।

which gem | xargs rm, उदाहरण के लिए, gemअपने पेट में निकाल देंगे ।


12

rmयह इनपुट नहीं लेता है, यह तर्क लेता है। ये अलग-अलग हैं। तर्क स्विच और फ़ाइल नाम हैं और इसके आगे आप अपने व्यवहार को प्रभावित करने के लिए कमांड लाइन पर एक कार्यक्रम देते हैं। इनपुट वह डेटा है जो प्रोग्राम काम करता है। उदाहरण के लिए, grepइनपुट और तर्क दोनों लेता है:

grep "foo" file.txt

वहाँ दो तर्क हैं "foo"और file.txtइनपुट है सामग्री की file.txt, नहीं स्ट्रिंग file.txtही। चूंकि grep इनपुट लेता है, आप इसे पाइपों के साथ उपयोग कर सकते हैं:

cat file.txt | grep "foo"

एक ही आउटपुट का उत्पादन करता है, क्योंकि बिल्ली file.txtएक तर्क के रूप में ले रही है, और आउटपुट की सामग्री का file.txtउत्पादन कर रही है। उस आउटपुट को grep में पाइप किया जाता है, grep होने के समान प्रभाव देते हुए फ़ाइल को पहले उदाहरण की तरह खोला जाता है।

यदि आप एक प्रोग्राम के आउटपुट को दूसरे के तर्क के रूप में उपयोग करना चाहते हैं , तो आप बैकटिक्स का उपयोग करते हैं:

rm `which gem`

या यह विकल्प (बैश-विशिष्ट) सिंटैक्स:

rm $(which gem)

संपादित करें: या xargsएक अन्य उत्तरदाता के रूप में बताते हैं। कमांड लाइन के साथ एक बिल्ली को त्वचा करने के कई तरीके।


यह ध्यान देने योग्य है कि cat file.txt | grep "foo"तुलना में सैकड़ों गुना धीमा हो सकता है grep "foo" file.txt
बोरेलिड

1
यह वह हिस्सा है जो मुझे नहीं मिला। मुझे कैसे पता चलेगा कि क्या तर्क है और मानक इनपुट क्या है?
अजेसी

8
@ajsie: यदि आप इसे प्रोग्राम के नाम के बाद टाइप करते हैं और एंटर दबाने से पहले, यह एक तर्क है। यदि आप इसे चालू करने के बाद प्रोग्राम में टाइप करते हैं, तो यह मानक इनपुट है।
बोरेलिड

1
समझ गया! यह सब कुछ समझाया। अब मुझे पता है कि मैं दोनों को सीधे कमांड का उपयोग कर सकता हूं और देख सकता हूं कि क्या यह मुझे (grep) का संकेत देता है और मैं यह देखने के लिए मैनुअल (मैन grep) भी पढ़ सकता हूं कि क्या यह std इनपुट का उपयोग करता है।
अजेसी

@ajsie: यदि आप मैनपेज में गोता नहीं लगाना चाहते हैं, तो grep --helpस्वीकृत तर्कों के त्वरित अवलोकन के लिए भी है ।
बोरेलिड

3

manउन आदेशों के पृष्ठ देखें जिनकी आप रुचि रखते हैं। इन कार्यक्रमों से संकेत मिलेगा कि वे पढ़ते हैं stdin( man grepएक लोकप्रिय आदेश के लिए प्रयास करें जो स्टड पढ़ता है)।


मैंने कोशिश की man grep | grep 'standard input'और If no file arguments are specified, the standard input is used.आखिरी मैच के रूप में मिला । Give मुझे grepइसकी अपनी दवा का थोड़ा स्वाद देना था । 😎
ma11hew28

2

यदि आपके पास अपने PATH में कोई निर्देशिका है जिसमें स्थान है या यदि कमांड नाम में स्थान है तो चलाने के लिए ये सभी खतरनाक हैं:

rm `which gem`       # Dangerous
rm $(which gem)      # Dangerous
which gem | xargs rm # Dangerous

GNU पैरेलल http: // www.gnu.org/software/parallel/ के पास वह समस्या नहीं है, इसलिए यह तब भी काम करेगा जब आपके पास अपने PATH में कोई निर्देशिका हो जिसमें स्थान हो या यदि कमांड नाम में स्थान हो:

which gem | parallel rm
parallel -a <(which bass) rm

जीएनयू समानांतर के लिए इंट्रो वीडियो देखें: http://www.youtube.com/watch?v=OpaiGYxkSuQ

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