सभी कमांडों से फाइल पर आउटपुट को रीडायरेक्ट करें, न कि लास्ट में


11

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

मैं रीडायरेक्शन वाली फ़ाइल में दोनों कमांड से आउटपुट कैसे लिखूं?

मैंने कोशिश की

echo "header line" | cut -c 1-5 input_file > output_file

echo "header line"; cut -c 1-5 input_file > output_file

यह केवल कट कमांड से आउटपुट रीडायरेक्ट करता है।

निम्न आदेश काम करता है, लेकिन अनाड़ी लगता है:

echo "header line" > output_file; cut -c 1-5 input_file >> output_file

मेरी समस्या को हल करने का चतुर तरीका क्या है?

जवाबों:


11

यहाँ समस्या लिनक्स पुनर्निर्देशन के साथ कोई समस्या नहीं है; बल्कि, यह एक बुनियादी गलतफहमी है कि पाइपलाइन कैसे काम करती है। यहां पुनर्निर्देशन काम नहीं कर रहा है क्योंकि केवल कट वास्तव में स्टडआउट के लिए मुद्रण है। इको कमांड के लिए स्टडआउट को स्टड काटने के लिए पाइप किया गया है (जो कि इस मामले में उपयोग नहीं किया जा रहा है क्योंकि फ़ाइल निर्दिष्ट है)।

echo "header line" > output_file && cut -c 1-5 input_file >> output_file

वह है जो आप चाहते हैं, और बिल्कुल भी अयोग्य नहीं है (मैंने आपके ;साथ इसे बदल दिया है &&ताकि कट कमांड केवल तभी निष्पादित होगा यदि हेडर सफलतापूर्वक लिखा गया है; इस तरह से यह निष्पादित नहीं होगा यदि आपके पास output_file बनाने या लिखने की अनुमति नहीं है )।

आप यह सब एक उप-प्रकार में भी कर सकते हैं, जैसे।

(echo "header line"; cut -c 1-5 input_file) > output_file

लेकिन ऐसा करने का कोई वास्तविक लाभ नहीं है और अधिक जटिल उदाहरणों के साथ यह समस्या पैदा कर सकता है यदि आप इस बात से परिचित नहीं हैं कि उप-भाग को कैसे बंद किया गया है।

यदि आप स्टडआउट के माध्यम से स्टड पास करने के लिए कट चाहते हैं, तो आप कोशिश कर सकते हैं:

echo "header line" | cut -c 1-5 - input_file

(स्टड के लिए डैश एक सामान्य शॉर्टकट है)

हालांकि, यह स्टड पर कट ऑपरेशन भी करेगा (परिणामस्वरूप "हेडर" की हेडर लाइन)। यह बताना मुश्किल है कि यह वही है जो आप चाहते हैं या नहीं।


13

आप क्या देख रहे हैं:

{ echo "header line"; cut -c 1-5 input_file; } > output_file
  • इस सिंटैक्स का कोई साइड इफेक्ट नहीं है क्योंकि कमांड को वर्तमान शेल में निष्पादित किया जाता है, न कि सबस्क्रिप्शन
  • आदेशों का एक स्पष्ट परिसीमन है जो output_file पर जाता है
  • यह अच्छी तरह से तराजू के रूप में आप इसे फिर से लिखना कर सकते हैं:

{
  echo "header line"
  cut -c 1-5 input_file
  ... # insert new commands here
} > output_file

क्या आप चाहते हैं कि त्रुटि आउटपुट उसी फ़ाइल पर जाए, आप अंतिम पंक्ति को इस तरह से संशोधित कर सकते हैं:

} > output_file 2>&1

उस टिप को याद दिलाने के लिए ओलिवियर दुलैक को धन्यवाद।

क्या आपको अपनी स्क्रीन पर जाने के लिए ब्लॉक के अंदर कुछ आउटपुट चाहिए, आप उस सिंटैक्स का उपयोग कर सकते हैं:

{
  echo "header line"
  echo "this line doesn't go to output_file" > /dev/tty
  cut -c 1-5 input_file
} > output_file

+1: यह स्पष्ट है और यह स्पष्ट रूप से पहचानता है कि कहां पुनर्निर्देशित किया गया है। (त्रुटि संदेश सहित) सब कुछ अनुप्रेषित करने के लिए: { .... } > some_file 2>&1( "पीटना" some_file पीटना नहीं है, लेकिन संलग्न यह करने के बजाय, बस बदलने के लिए होगा। >एक में >>: { ... } >> some_file 2>&1)
ओलिवर Dulac

4

बस उन उत्तरों को राउंड आउट करने के लिए निष्पादन है।

exec > output_file
echo "header line"
cut -c 1-5 input_file

+1: लिपियों में इसका उपयोग करना बहुत सामान्य है (कम से कम कमांड लाइन पर, क्योंकि चीजें भ्रमित होने लगती हैं ^ ^)
ओलिवियर दुलैक

क्या कोई इस समाधान के बारे में विस्तार से बता सकता है? मैं देख सकता हूं कि यह क्या कर रहा है, लेकिन मैं इस संदर्भ में 'अमल' नहीं करता। इसके अलावा, यह कुछ ऐसा दिखता है जिसे आपको फिर से बंद करना पड़ता है यदि आपकी स्क्रिप्ट के बाकी हिस्सों को सामान्य स्टडआउट की आवश्यकता होती है।
जो

1
जब आप किसी आदेश के बिना स्क्रिप्ट में निष्पादन का उपयोग करते हैं, तो आप निष्पादन पर I / O पुनर्निर्देशन कर सकते हैं जो वर्तमान शेल और सभी भविष्य के बच्चों को प्रभावित करता है।
hildred

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