पाइप का उपयोग करके एक कमांड में दो तर्क पारित करना


22

आमतौर पर, हमें केवल एक तर्क पास करना होगा:

echo abc | cat
echo abc | cat some_file -
echo abc | cat - some_file

क्या दो तर्कों को पारित करने का एक तरीका है? कुछ इस तरह

{echo abc , echo xyz} | cat
cat `echo abc` `echo xyz`

मैं सिर्फ पहले एक फ़ाइल में दोनों परिणामों को स्टोर कर सकता था

echo abc > file1
echo xyz > file2
cat file1 file2

लेकिन फिर मैं गलती से किसी फ़ाइल को अधिलेखित कर सकता हूं, जो ठीक नहीं है। यह एक गैर-संवादात्मक स्क्रिप्ट में जा रहा है। मूल रूप से, मुझे catएक फ़ाइल पर लिखने के बिना दो मनमाना आदेशों के परिणामों को पारित करने का एक तरीका चाहिए ।


अद्यतन: क्षमा करें, उदाहरण समस्या का सामना करता है। जबकि { echo abc ; echo xyz ; } | catकाम करने लगता है, आउटपुट एस के कारण है echo, न कि cat

एक बेहतर उदाहरण वह होगा { cut -f2 -d, file1; cut -f1 -d, file2; } | paste -d,जो उम्मीद के मुताबिक काम नहीं करता है।

साथ में

file1:
a,b
c,d

file2:
1,2
3,4

अपेक्षित उत्पादन है:

b,1
d,3

समाधान किया गया:

प्रक्रिया प्रतिस्थापन का उपयोग करें :cat <(command1) <(command2)

वैकल्पिक रूप से, नामित पाइप का उपयोग करें mkfifo:

mkfifo temp1
mkfifo temp2
command1 > temp1 &
command2 > temp2 &
cat temp1 temp2

कम सुरुचिपूर्ण और अधिक वर्बोज़, लेकिन ठीक काम करता है, जब तक कि आप सुनिश्चित करें कि temp1 और temp2 हाथ से पहले मौजूद नहीं हैं।


1
इससे मुझे अपना सिर खुजाना पड़ता है। आप एक ही बिल्ली को दो अलग-अलग कमांड पाइप करना चाहते हैं?
user606723

2
आप जानते हैं कि "पाइपिंग" और "तर्क" दो पूरी तरह से असंबंधित अवधारणाएं हैं, है ना?
इग्नासियो वाज़क्वेज़-अब्राम्स

@Ignacio इरेट ... मैं लिनक्स से परिचित नहीं हूं इसलिए मुझे वास्तव में अंतर नहीं पता है। मैंने हमेशा सोचा कि पाइपिंग का मतलब है कि यह पिछले परिणाम को एक तर्क के रूप में लेता है। मेरी देखभाल करने के लिए?
गौईं

@firebat नहीं, पाइप का मतलब अगले कमांड के मानक इनपुट के रूप में पिछली कमांड के स्टडआउट को लेना है। आपके पास अभी भी तर्क हो सकते हैं, जो एक अलग अवधारणा हैं।
रिच होमोलका

यह भी, जहाँ तक आपका अद्यतन पाठ, आउटपुट बिल्ली से आया है, बस आप चाहते हैं कि कथन बिल्ली के लिए अलग-अलग लगें, जो कि ऐसा नहीं कर सकते क्योंकि वे एक धारा में क्रमबद्ध हैं।
रिच होमोलका

जवाबों:


17

मुझे लगता है कि आप 'प्रक्रिया प्रतिस्थापन' http://tldp.org/LDP/abs/html/process-sub.html चाहते हैं । यह zsh पर भी काम करता है, हालांकि इसमें अधिक विकल्प हैं और वाक्य रचना अलग हो सकती है।

यह /dev/fd/somethingप्रत्येक प्रतिस्थापन के लिए एक छद्म फ़ाइल ( ) बनाता है । यह बहुत उपयोगी है। कमांड केवल एक स्ट्रीम के रूप में पढ़ सकता है, जिसका अर्थ है कि यह fseek के साथ आगे और पीछे नहीं जा सकता है। इसे पाइप की तरह बाइट्स की धारा के रूप में पढ़ने की जरूरत है।

आपके उदाहरण प्रक्रिया प्रतिस्थापन के रूप में काम करते हैं:

cat <(echo abc) <(echo xyz)
paste -d, <(cut -f2 -d, file1) <(cut -f1 -d, file2)

एक प्रक्रिया का उपयोग करने के लिए एक उपकरण के रूप में सोचो और यह किसी भी अस्थायी फ़ाइलों के बिना एक फ़ाइल होने का दिखावा है।

(मेरे पहले उत्तर से )


2

घुंघराले ब्रेसिज़ वाली चीज़ ने वास्तव में काम किया क्योंकि पाइप ऑपरेटर समूहबद्ध कमांड के मानक आउटपुट को तीसरे के मानक इनपुट में जोड़ देगा।

आप बता सकते हैं कि प्रिंटआउट मानक इनपुट का उपयोग नहीं करने वाले किसी भी आदेश को इको से नहीं है, उदाहरण के { echo 1; echo 2;} | echo 3लिए 1 \ n2 \ n3 के विपरीत 3 प्रिंट करेगा।

हालाँकि, यह वह चीज नहीं है जो आप चाहते थे क्योंकि घुंघराले ब्रेसिज़ में दो कमांड एक ही आउटपुट को लिख रहे हैं जो catउनके परिणामों की तरह है । आदेशों के लिए दो तर्कों के रूप में उपयोग करने के लिए दो अलग-अलग परिणाम उत्पन्न करने के लिए paste, आपको एक अस्थायी फ़ाइल या नामांकित पाइप का उपयोग करना होगा।

आप mktempएक अद्वितीय अस्थायी फ़ाइल उत्पन्न mkfifoकरने के लिए या FIFO पाइप फ़ाइल बनाने के लिए उपयोग कर सकते हैं ।


आपके उत्तर के लिए एक बड़ा धन्यवाद, मैंने इस समाधान के लिए बहुत दिन खोजे और अंत में यहाँ आपका उत्तर मिला।
सईद फलासफिन

2

मुझे xargs पसंद है एक उदाहरण के रूप में मैं / usr / स्थानीय के तहत सभी mysql डेटा dir के आकार को खोजना चाहता हूं

osx: स्थानीय उपयोगकर्ता $ pwd
/ Usr / स्थानीय
osx: स्थानीय उपयोगकर्ता $ ls | grep mysql
माई एसक्यूएल
mysql-5.0.51a-osx10.5-x86_64
mysql-5.0.51b-osx10.5-x86_64
mysql-5.1.39-osx10.5-x86_64
mysql-5.6.17-osx10.7-x86_64
ओएस एक्स: स्थानीय उपयोगकर्ता $ ls | grep mysql | sudo xargs du -sh
4.0K mysql
2.8G mysql-5.0.51a-osx10.5-x86_64
 10G mysql-5.0.51b-osx10.5-x86_64
 25G mysql-5.1.39-osx10.5-x86_64
753M mysql-5.6.17-osx10.7-x86_64
osx: स्थानीय उपयोगकर्ता $ 

xargs

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