2016-01-01 6 views
5

मैं एक शेल स्क्रिप्ट लिखना चाहता हूं जो मानक इनपुट से डेटा स्वीकार करता है, इसे फ़ाइल में लिखें और उसके बाद कुछ करता है।मानक इनपुट से डेटा पढ़ने के लिए बिल्ली का उपयोग कर रहा है और इसे फ़ाइल में लिखना बिल्ली का बेकार उपयोग नहीं है?

इस सवाल के प्रयोजन के लिए है, तो यह से एक स्ट्रिंग "foo" grep और out.txt के उत्पादन लिखते हैं कि मेरी स्क्रिप्ट मानक इनपुट को स्वीकार करना चाहिए हमें मान लें, यह in.txt को लिखने,।

मैंने इस स्क्रिप्ट को लिखा था।

cat > in.txt 
grep foo in.txt > out.txt 

के रूप में समझाया में नीचे जवाब में से कुछ, एक बस

tee in.txt | grep foo > out.txt 

इस्तेमाल कर सकते हैं क्या होगा अगर यह grep के बजाय कुछ अन्य आदेश है कि मानक इनपुट से नहीं पढ़ता है? क्या यह तब बिल्ली का वैध उपयोग बन जाता है?

chmod के साथ ऐसा एक उदाहरण है।

cat > in.txt 
chmod -v 600 in.txt > out.txt 

यह एक आवश्यकता है कि स्क्रिप्ट समाप्त होने के बाद दोनों इनपुट और आउटपुट फाइलों में उपलब्ध हो।

मैं जानना चाहता हूं कि मेरा कोड cat का बेकार उपयोग कर रहा है या यदि यह cat इस तरह से लागू किया जा सकता है तो यह एक पूरी तरह से मान्य परिदृश्य है?

इसके अलावा, cat का उपयोग किए बिना इस कोड को फिर से लिखने का कोई तरीका है, जिससे कि यह किसी भी कमांड का बेकार उपयोग नहीं करता है?

नोट: मुझे ऐसे उत्तरों से चिंतित है जो किसी भी POSIX अनुपालन खोल पर लागू होते हैं, न केवल बैश या लिनक्स पर।

+0

अपने उदाहरण में, क्यों नहीं 'grep foo out.txt && nextcmd out.txt'? (एक * कंपाउंड कमांड * का उपयोग करना) (** नोट: ** प्रारंभिक पुनर्निर्देशन वैकल्पिक है) –

+0

@ डेविडसी। रैंकिन मैं यह देखने में असफल रहा कि आपकी टिप्पणी कैसे प्रासंगिक है। मैं पहले से ही 'grep foo in.txt> out.txt' कर रहा हूं, जहां' in.txt' में मानक इनपुट से पढ़ा गया पाठ शामिल है। के लिए 'nextcmd out.txt' क्या है? –

+0

बहुत कम आदेश stdin से नहीं पढ़ेगा। कभी-कभी आपको इंगित करने के लिए '-' निर्दिष्ट करना होगा कि इनपुट stdin में है। बहुत ही मौलिक रूप से आपको इसे स्पेल करने की आवश्यकता होती है: 'dev/stdin' – rici

उत्तर

4

इसका cat का वैध उपयोग है, लेकिन tee आदेश वह है जो आप चाहते हैं। यह सब कुछ एक फाइल में लिखने और stdout करने के लिए डिज़ाइन किया गया है।

tee in.txt | grep foo > out.txt 
+0

हालांकि, सामान्य मामले में जहां 'some_command' मानक इनपुट से पाठ नहीं पढ़ सकता है, मुझे अभी भी 'cat> in.txt के लिए जाना होगा; some_command in.txt> out.txt', है ना? या मैं 'tee in.txt>/dev/null के लिए जाना चाहिए; some_command in.txt> out.txt'? –

+0

'tee in.txt>/dev/null'' cat> in.txt' से भी बदतर है। –

+2

@LoneLearner - दाएं। कार्यक्रम 'stdin' पढ़ता है तो 'टीई' अच्छा है। अगर यह एक फाइल चाहता है, तो 'cat> in.txt' जाने का रास्ता है। जब तक फ़ाइल विशाल नहीं है, यह ऑपरेटिंग सिस्टम की डिस्क कैश में होगी, इसलिए यह तेज़ होगा। – tdelaney

-1

बिल्ली के प्रयोजन को श्रेणीबद्ध करने के लिए (या "कड़ी लगाकर जोड़ना") फ़ाइलों है। यदि यह केवल एक फ़ाइल है, तो इसे किसी भी चीज़ के साथ संयोजित करना समय की बर्बादी है, और आपको एक प्रक्रिया का खर्च होता है। -- era eriksson

तो, हाँ, यह वास्तव में बेकार है। tee समाधान मुझे ऐसा करने के लिए सबसे अधिक POSIXy तरीके के रूप में हमला करता है, लेकिन यदि आप दो प्रक्रियाओं की लागत बहुत अधिक थी तो आप शैल-विशिष्ट संरचनाओं को तैनात कर सकते थे।

+0

क्या होगा यदि यह 'grep' की बजाय कुछ अन्य कमांड है जो मानक इनपुट से नहीं पढ़ता है? क्या यह तब बिल्ली का वैध उपयोग बन जाता है? मैंने इसे अपने प्रश्न में अभी जोड़ा है। –

संबंधित मुद्दे