Bash
प्रक्रिया प्रतिस्थापन
खोज…
टिप्पणियों
प्रक्रिया प्रतिस्थापन एक पुनर्निर्देशन का एक रूप है जहां एक प्रक्रिया के इनपुट या आउटपुट (कुछ अनुक्रम के आदेश) एक अस्थायी फ़ाइल के रूप में दिखाई देते हैं।
वेब से दो फ़ाइलों की तुलना करें
निम्नलिखित के साथ दो फ़ाइलों तुलना diff
प्रक्रिया प्रतिस्थापन का उपयोग कर के बजाय अस्थायी फ़ाइलों को बनाने।
diff <(curl http://www.example.com/page1) <(curl http://www.example.com/page2)
एक कमांड के आउटपुट के साथ थोड़ी देर लूप फ़ीड करें
यह एक grep
कमांड के आउटपुट के साथ while
लूप देता है:
while IFS=":" read -r user _
do
# "$user" holds the username in /etc/passwd
done < <(grep "hello" /etc/passwd)
पेस्ट कमांड के साथ
# Process substitution with paste command is common
# To compare the contents of two directories
paste <( ls /path/to/directory1 ) <( ls /path/to/directory1 )
सम्मिलित करने वाली फाइलें
यह सर्वविदित है कि आप एक ही कमांड में इनपुट और ouput के लिए एक ही फाइल का उपयोग नहीं कर सकते हैं। उदाहरण के लिए,
$ cat header.txt body.txt >body.txt
आप जो चाहते हैं वह नहीं करता है। जब तक cat
body.txt
पढ़ती है, तब तक यह पहले से ही पुनर्निर्देशित हो चुका होता है और यह खाली होता है। अंतिम परिणाम यह होगा कि body.txt
की सामग्री का आयोजन करेगा header.txt
केवल।
एक प्रक्रिया प्रतिस्थापन के साथ इससे बचने के लिए सोच सकता है, वह यह है कि कमांड
$ cat header.txt <(cat body.txt) > body.txt
फ़ाइल के पुनर्निर्देशन से छंटनी से पहले body.txt
की मूल सामग्री को किसी बफर में किसी तरह से सहेजने के लिए body.txt
किया जाएगा। यह काम नहीं करता है। कोष्ठक में cat
सभी फ़ाइल विवरणों को स्थापित करने के बाद ही फ़ाइल पढ़ना शुरू करती है, ठीक बाहरी की तरह। इस मामले में प्रक्रिया प्रतिस्थापन का उपयोग करने की कोशिश करने का कोई मतलब नहीं है।
इंटरमीडिएट बनाने के लिए एक फाइल को दूसरी फाइल में डालने का एकमात्र तरीका है:
$ cat header.txt body.txt >body.txt.new
$ mv body.txt.new body.txt
sed
-इन-प्लेस विकल्प (आमतौर पर -i
) के साथ कॉल किए जाने पर कालीन के नीचे जो sed
या perl
या इसी तरह के प्रोग्राम होते हैं।
एक बार में कई प्रोग्राम के जरिए फाइल को स्ट्रीम करें
यह एक बड़ी फ़ाइल में लाइनों की संख्या को wc -l
साथ गिनता है जबकि साथ में इसे gzip
साथ कंप्रेस करता है। दोनों समवर्ती रूप से चलते हैं।
tee >(wc -l >&2) < bigfile | gzip > bigfile.gz
आम तौर पर tee
अपने इनपुट को एक या अधिक फाइलों (और स्टडआउट) में लिखता है। हम tee >(command)
साथ फाइलों के बजाय कमांड को लिख सकते हैं tee >(command)
।
यहां कमांड wc -l >&2
tee
से पढ़ी गई लाइनों को गिनता है (जो बदले में bigfile
से पढ़ रहा है)। ( gzip
इनपुट के साथ मिश्रण से बचने के लिए लाइन काउंट को stderr ( >&2
) पर भेजा जाता है।) tee
के tee
को एक साथ gzip
में फीड किया जाता है।
उप-शेल के उपयोग से बचने के लिए
प्रक्रिया प्रतिस्थापन का एक प्रमुख पहलू यह है कि यह हमें शेल से पाइपिंग कमांड को उप-शेल के उपयोग से बचने देता है।
यह नीचे एक सरल उदाहरण के साथ प्रदर्शित किया जा सकता है। मेरे वर्तमान फ़ोल्डर में निम्नलिखित फाइलें हैं:
$ find . -maxdepth 1 -type f -print
foo bar zoo foobar foozoo barzoo
अगर मैं while
लिए पाइप / read
लूप लेता हूं जो एक काउंटर को निम्नानुसार बढ़ाता है:
count=0
find . -maxdepth 1 -type f -print | while IFS= read -r _; do
((count++))
done
$count
अब 6
शामिल नहीं है, क्योंकि यह उप-खोल संदर्भ में संशोधित किया गया था। नीचे दिखाए गए आदेशों में से कोई भी उप-शेल संदर्भ में चलाया जाता है और उप-शेल समाप्त होने के बाद उपयोग किए जाने वाले चर का दायरा खो जाता है।
command &
command | command
( command )
प्रक्रिया प्रतिस्थापन पाइप के उपयोग से बचकर समस्या का समाधान करेगा |
में ऑपरेटर के रूप में
count=0
while IFS= read -r _; do
((count++))
done < <(find . -maxdepth 1 -type f -print)
यह count
वैरिएबल वैल्यू को बरकरार रखेगा क्योंकि कोई सब-शेल नहीं लगाया गया है।