क्या एक कमांड के आउटपुट को एक से अधिक कमांड में रीडायरेक्ट करना संभव है?


21

जहाँ तक मुझे पता है, मैं स्क्रीन पर मानक आउटपुट और आगे की फ़ाइलों को विभाजित करने के लिए टी कमांड का उपयोग कर सकता हूं:

command -option1 -option2 argument | tee file1 file2 file3 

क्या टी का उपयोग करके फाइलों के बजाय कमांड को आउटपुट को रीडायरेक्ट करना संभव है, ताकि मैं सैद्धांतिक रूप से कमांड की एक श्रृंखला बना सकूं?


3
समझाएँ कि "आउटपुट सिग्नल" से आपका क्या मतलब है और "कमांड्स के नेटवर्क" के निर्माण से आपका क्या मतलब है।
जैनिस

लिनक्स में प्रत्येक कमांड में एक इनपुट और दो आउटपुट होते हैं। उन्हें 0 (इनपुट के लिए), 1 (आउटपुट के लिए) और 2 (त्रुटि आउटपुट के लिए) के साथ लेबल किया गया है। मैं 1 के बारे में सोच रहा था जब मैंने "आउटपुट सिग्नल" कहा था क्योंकि मैंने पढ़ा था कि टी कमांड केवल लेबल वाले आउटपुट को विभाजित करता है। जब मैंने कहा कि "कमांड का नेटवर्क" मैं बहुत तकनीकी नहीं था, मुझे यकीन नहीं है कि नेटवर्क को सही तरीके से कैसे परिभाषित किया गया है एक गणितीय दृष्टिकोण, लेकिन मैं बस कमांड के एक पेड़ के बारे में सोचकर बोल रहा था, ताकि कुछ कमांड एक से अधिक चाइल्ड कमांड के लिए माता-पिता बन सकें।
अब्दुल अल हज़्रेड

अपना स्पष्टीकरण के लिए धन्यवाद। कृपया शब्द संकेत का उपयोग न करें क्योंकि इसका यूनिक्स में एक विशिष्ट अर्थ है, और इस संदर्भ में यह शब्द बहुत भ्रामक था। एक बार फिर धन्यवाद।
Janis

UNIX और Linux में इस मुख्य अवधारणा के विशेष अर्थ को जानने के लिए कमांड-लाइन पर मैन -k सिग्नल डालें। आदमी को मारने के लिए एक अच्छा पेज शुरू होगा।
रोब

इसके अलावा, कई लोग इनपुट या आउटपुट 'स्ट्रीम' के रूप में स्टड स्काउट और स्टेडर को संदर्भित करते हैं। डेटा की छोटी नदियाँ जैसी हैं इसलिए एक धारा। आप उन्हें सामूहिक रूप से वर्णन करने के लिए एक शब्द के लिए जूझने के लिए सही थे लेकिन संकेत सिर्फ गलत शब्द है।
रोब

जवाबों:


25

आप कमांड लाइन पर नामांकित पाइप ( http://linux.die.net/man/1/mkfifo ) का उपयोग कर सकते हैं और नामित पाइपों पर teeपढ़ने की आज्ञा दे सकते हैं।

mkfifo /tmp/data0 /tmp/data1 /tmp/data2
cmd0 < /tmp/data0 & cmd1 < /tmp/data1 & cmd2 < /tmp/data2 &
command -option1 -option2 argument | tee /tmp/data0 /tmp/data1 /tmp/data2

जब commandखत्म हो जाता है, teeतो नामित पाइपों को बंद कर देंगे, जो कि प्रत्येक पर एक ईओएफ (0 बाइट्स पढ़ने) का संकेत देगा, जो /tmp/dataNसामान्य रूप से cmdNप्रक्रियाओं को समाप्त करेगा । वास्तविक उदाहरण:

$ mkfifo /tmp/data0 /tmp/data1 /tmp/data2
$ wc -l < /tmp/data0 & wc -w < /tmp/data1 & wc -c < /tmp/data2 &
$ tee /tmp/data0 /tmp/data1 /tmp/data2 < /etc/passwd >/dev/null
$ 61
1974
37

पृष्ठभूमि प्रक्रियाओं के कारण, शेल प्रोग्राम आउटपुट से पहले एक शीघ्र लौटा। wcसामान्य रूप से समाप्त होने के सभी तीन उदाहरण हैं ।


1
में bash , आप के माध्यम से टाइपिंग की सुरक्षित एक बहुत कर सकते हैं /tmp/data/{0,1,2}। फिर से, बाश में आप प्रक्रिया प्रतिस्थापन का उपयोग कर सकते हैं और mkfifoपूरी तरह से छोड़ सकते हैं
टोबियास किंजलर

2
/ Dev / data0 को / tmp / data0 में बदलना चाहते हैं। साथ ही, शेल-अज्ञेय तरीके से प्रश्न का उत्तर देने के लिए धन्यवाद। यह मानने से ज्यादा मददगार है कि हर कोई बैश का इस्तेमाल कर रहा है।
abonet

15

अगर मैं सही तरीके से समझूं, तो आप बराबर के लिए देख रहे हैं tee file1 file2 file3, लेकिन एक ही डेटा को तीन फ़ाइलों में लिखें file1, file2और file3, आप एक ही डेटा को तीन कमांड में पाइप करना चाहते हैं cmd1, cmd2और cmd3,

… | ??? cmd1 cmd2 cmd3

के बराबर होना चाहिए

… | cmd1 &
… | cmd2 &
… | cmd3 &

सिवाय इसके कि केवल एक बार ही निष्पादित किया जाएगा।

ऐसा करने के दो तरीके हैं।

Ksh93, बैश और zsh समर्थन प्रक्रिया प्रतिस्थापन । यह पाइपों का एक सामान्यीकरण है जो कमांड के तर्क को एक फाइल बनाने की अनुमति देता है, जिसे जब लिखा जाता है, तो कमांड के इनपुट के रूप में डेटा को पास करता है (इनपुट वेरिएंट भी है, जो जब पढ़ा जाता है, तो कमांड द्वारा डेटा आउटपुट प्राप्त करता है) । अर्थात्,

echo hello | tee >(cmd1)

प्रिंट helloमानक आउटपुट में और इसके अलावा में चलाता है cmd1के साथ helloइनपुट के रूप में।

इसलिए, उदाहरण के लिए, यदि आप के इनपुट को डुप्लिकेट करना चाहते हैं somecommandऔर इसे दोनों को पास करना चाहते हैं cmd1और cmd2, आप उपयोग कर सकते हैं

somecommand | tee >(cmd1) | cmd2

यदि आपका शेल प्रक्रिया प्रतिस्थापन का समर्थन नहीं करता है, तो आप इसके बजाय नामित पाइप का उपयोग कर सकते हैं। यह कैसे काम करता है, इसके लिए Arcege का उत्तर देखें । नामांकित पाइप प्रक्रिया प्रतिस्थापन की तुलना में कम सुविधाजनक हैं क्योंकि आपको उन्हें बनाना होगा और उन्हें हटाना होगा, और मैन्युअल रूप से प्रक्रियाओं को शुरू और सिंक्रनाइज़ करना होगा। उन्हें पूरी तरह से पोर्टेबल होने का फायदा है, जबकि सभी गोले प्रक्रिया प्रतिस्थापन का समर्थन नहीं करते हैं। उनका उपयोग उन परिदृश्यों में भी किया जा सकता है जिनकी प्रक्रिया प्रतिस्थापन के अलावा है।

हुड के तहत, कुछ प्रणालियों पर, प्रक्रिया प्रतिस्थापन आंतरिक रूप से नामित पाइप का उपयोग करता है। अधिकांश प्रणालियों पर, हालांकि, यह फ़ाइल विवरणकों का प्रतिनिधित्व करने वाली नामित फ़ाइलों पर निर्भर करता है ।


5
peeसे भी देखें moreutils
स्टेफेन चेज़लस

ध्यान दें कि प्रक्रिया प्रतिस्थापन ksh88 द्वारा पेश किया गया था।
स्टीफन चेज़लस


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