अन्य कमांड में आउटपुट कैसे करें?


83

उदाहरण:

ls | echoप्रिंट कुछ नहीं (वास्तव में एक रिक्त रेखा)। मुझे उम्मीद है कि यह फाइलों की एक सूची मुद्रित करेगा।

ls | grep 'foo'दूसरी ओर, अपेक्षित के रूप में काम करता है (उनके नाम में 'फू' के साथ फाइल प्रिंट करता है)।

इन स्थितियों में मैं जो कुछ करता हूं वह कुछ ऐसा है: ls | while read OUT; do echo $OUT; doneलेकिन यह बोझिल है।

पाइपिंग कुछ कमांड के साथ काम क्यों करता है, लेकिन दूसरों के साथ नहीं? मैं इस मुद्दे को कैसे दरकिनार कर सकता हूं?


2
आप क्या करने की उम्मीद ls | echoकरते हैं? बस चलाते क्यों नहीं ls?
ओमेगा

12
मैंने सबसे सरल उदाहरण का उपयोग किया जो मेरी बात को दर्शाता है। मुझे वास्तव में इस समस्या का सामना करना पड़ा जब मैं एक-लाइनर बनाने की कोशिश कर रहा था जो ऑब्जेक्ट स्टोर और उनके प्रकार में गिट ऑब्जेक्ट दिखाएगा। इसलिए, मैंने ऑब्जेक्ट आईडी को पाइप किया git cat-file, लेकिन यह सिर्फ काम नहीं किया। जाहिरा तौर पर, गूंज का व्यवहार समान है, इसलिए मैंने इसे एक उदाहरण के रूप में इस्तेमाल किया।
मिहई रोटारू

xargs के लिए -n कमांड को भी देखें, यह कहता है कि सबकुंड पर कितने तर्क हैं। `... | xargs -n1 git cat-file`
रिच

जवाबों:


118

कमांड लाइन तर्कों और मानक इनपुट के बीच एक अंतर है। एक पाइप एक प्रक्रिया के मानक आउटपुट को दूसरे के मानक इनपुट से जोड़ेगा। इसलिए

ls | echo

इको के मानक इनपुट के लिए ls के मानक आउटपुट को जोड़ता है। ठीक है ना? खैर, प्रतिध्वनि मानक इनपुट को नजरअंदाज करती है और इसके कमांड लाइन तर्कों को डंप करेगी - जो इस मामले में कोई भी नहीं हैं - अपने स्वयं के स्टडआउट। आउटपुट: कुछ भी नहीं।

इस मामले में कुछ समाधान हैं। एक कमांड का उपयोग करना है जो स्टडिन को पढ़ता है और स्टडआउट को डंप करता है, जैसे कि बिल्ली।

ls | cat

'काम' होगा, जो आपके काम की परिभाषा पर निर्भर करता है।

लेकिन सामान्य मामले के बारे में क्या। आप वास्तव में क्या चाहते हैं कि एक कमांड के स्टडआउट को दूसरे के कमांड लाइन को कमांड में बदलना है। जैसा कि दूसरों ने कहा है, xargsइस मामले में विहित सहायक उपकरण है, इसकी कमांड लाइन को पढ़ने के लिए इसकी स्टड से एक कमांड आती है, और चलाने के लिए कमांड का निर्माण होता है।

ls | xargs echo

आप प्रतिस्थापन कमांड का उपयोग करके इसे कुछ रूपांतरित भी कर सकते हैं $()

echo $(ls)

आप जो चाहते हैं वह भी करेंगे।

ये दोनों उपकरण शेल स्क्रिप्टिंग के लिए बहुत महत्वपूर्ण हैं, आपको दोनों सीखना चाहिए।

पूर्णता के लिए, जैसा कि आप प्रश्न में इंगित करते हैं, स्टड को कमांड लाइन आर्ग में बदलने का अन्य आधार तरीका शेल की बिलियन readकमांड है। यह "शब्द" ( IFSचर के रूप में परिभाषित शब्द ) को एक अस्थायी चर में परिवर्तित करता है , जिसे आप किसी भी कमांड रन में उपयोग कर सकते हैं।


1
एक बहुत ही उपयोगी जानकारीपूर्ण उत्तर, धन्यवाद! मैं वर्तमान में बैश सीख रहा हूं, और मैंने पहले भी xargs और $ (*) नोटेशन दोनों देखा है, लेकिन उन पर ज्यादा ध्यान नहीं दिया। अब मुझे पता है कि वे कितने महत्वपूर्ण हैं, और निश्चित रूप से उन पर गौर करेंगे।
मिहई रोटारू

1
ओपी को जिस चीज की तलाश थी वह हो सकता है।
इकतीस

19

ls | echoकेवल एक रिक्त रेखा प्रिंट करता है क्योंकि echoकोई इनपुट नहीं पढ़ता है; पाइपलाइन की अंतिम कमान वास्तव में है echoकि एक खाली लाइन के अलावा कुछ भी नहीं छापती है।

आम तौर पर:

a | b

यह सुनिश्चित करता है कि आउटपुट का aइनपुट बन जाए b। मेरा सुझाव है कि आप इसका Pipelinesखंड पढ़ें man bash


यदि आप वास्तव में उपयोग करना चाहते हैं lsऔर echoसाथ में यहाँ कुछ (बहुत बेकार) उदाहरण हैं:

ls | xargs -L 1 echo
echo `ls`
for i in `ls` ; do echo $i ; done

11

आप चाहते हैं कमांड कोशिश:echols

ls | xargs echo

echoके आउटपुट के साथ यह कॉल करेगा ls


3
या ls | xargs -I {} echo {}यदि आप चाहते हैं कि इसे व्यक्तिगत रूप से प्रत्येक पंक्ति के लिए बुलाया जाए
एलेक्स अब्दुगाफारोव

3

क्यों नहीं बस का उपयोग करें:

echo `ls`

या अधिक सुरक्षित:

echo "`ls -lrt`"

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