एक स्क्रिप्ट की गति के लिए कई फ़ाइलों की सामग्री खिलाने के लिए आशुलिपि


20

मान लीजिए कि मेरे पास एक स्क्रिप्ट है script, जो पढ़ती है stdinऔर स्क्रीन पर कुछ परिणाम निकालती है।

अगर मैं उसे एक फ़ाइल की सामग्री खिलाना चाहता था, तो मैं टाइप कर सकता था:

$ ./script < file1.txt

लेकिन क्या होगा यदि मैं उसी तरह स्क्रिप्ट को कई फाइलों की सामग्री खिलाना चाहता हूं, क्या यह बिल्कुल संभव है? अब तक का सबसे अच्छा मैं आया था:

cat file1.txt file2.txt > combined.txt && ./script < combined.txt

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


स्विच करें zshऔर आप चला पाएंगे cmd <file1 <file2 ... <fileN;)
don_crissti

जवाबों:


20

आप catएक पाइप का उपयोग कर सकते हैं :

cat file1 file2 file3 ... fileN | ./script

आपका उदाहरण, पाइप का उपयोग कर, और कोई अस्थायी फ़ाइल नहीं:

join file1.txt file2.txt | ./script

डी 'ओह। यह इतना सरल है कि मुझे यह भी पता नहीं है कि मुझे खुद इसका एहसास कैसे नहीं हुआ। धन्यवाद!
0x4B1D

10
बिल्ली पुरस्कार का उपयोगी उपयोग!
ग्लेन जैकमैन

4
@ ब्रूस एडगर: मुझे लगता है कि आप सिर्फ joinएक अस्थायी फ़ाइल के बिना उपयोग करने का एक तरीका बता रहे थे , लेकिन सिर्फ पाठक को यह स्पष्ट करने के लिए: cat f1 f2एक ही आउटपुट का उत्पादन नहीं करता हैjoin f1 f2
पीटर।

@ यह बताने के लिए धन्यवाद - मैंने joinअपने उदाहरण में उपयोग किया क्योंकि मैं इसके साथ खेल रहा था; वास्तव में, मेरे उदाहरण के लिए मैं उपयोग कर रहा था cat
0x4B1D

10

यदि आप पाइप का उपयोग नहीं करना चाहते हैं, तो आप प्रक्रिया प्रतिस्थापन के साथ इनपुट पुनर्निर्देशन का उपयोग कर सकते हैं:

./script <(cat file1 file2)

3

@ जोंह ब्रौन के उत्तर को जोड़ने के लिए, यदि आपको कभी भी अपनी स्क्रिप्ट में प्रक्रिया आउटपुट जोड़ने की आवश्यकता होती है, अर्थात आपकी फ़ाइल आपकी डिस्क पर नहीं हो सकती है, लेकिन इसका URLउपयोग curlया इसी तरह के टूल के माध्यम से किया जा सकता है ।

इस तरह की चीज़ों stdoutको कई प्रक्रियाओं के लिए इस्तेमाल किया जा सकता है और उन्हें स्क्रिप्ट के माध्यम से उपयोग किया जा सकता हैstdin

इनपुट स्क्रिप्ट को संभालने के लिए यह स्क्रिप्ट होगी multi-input.sh:

#!/usr/bin/env bash
while read line; do
    echo $line
done

अब इसका परीक्षण करें:

$ ./multi-input.sh < <(cat <(echo process 1) <(echo process 2) <(echo process 3))

आउटपुट:

process 1
process 2
process 3

<()बारी-बारी से एक आभासी में की प्रक्रिया fileका उपयोग कर fdयदि आप, तो होगा <इसे पढ़ने के लिए की जरूरत है। catखुद को इसकी आवश्यकता नहीं है क्योंकि यह वही करता है जो फाइलों, आभासी या वास्तविक को समेटता है।

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