कैसे `>` और `>>` काम करते हैं?


9

मैंने revएक फ़ाइल की कोशिश की और फिर उसे पाइप कर दिया, cat > same_fileलेकिन यह एक रिक्त फ़ाइल में बदल रही थी।

जबकि मैंने कोशिश की rev file.txt | cat > file2.txt && mv file.txt file2.txt;यह काम किया।

rev file.txt | cat >> file.txt;काम भी किया।

लेकिन जब मैंने कोशिश की तो rev file.txt | cat > file.txtवह असफल रहा।


आप catइस तरह से बाहर भी छोड़ सकते हैं rev file.txt > file2.txt && mv file2.txt file.txt:। यह एक शानदार उपयोग हैcat । इसे छोड़ने से आप एक अतिरिक्त प्रक्रिया पैदा करते हैं।
मगेटा

जवाबों:


19

रीडायरेक्ट करने के दोनों तरीकों (> और >>) के बीच इस मामले में आपको जो मूल बात समझनी है, वह है:

>

जहाँ यह इंगित किया गया था उस जानकारी को रीडायरेक्ट करता है और अधिलेखित करता है। पाइप के माध्यम से कोई भी सूचना प्राप्त करते समय ऐसा होता है "|"

>>

सूचनाओं को पुनर्निर्देशित करता है और सूचित करता है। पाइप के माध्यम से कोई भी सूचना प्राप्त करते समय ऐसा होता है "|"

दोनों मामलों में यदि फ़ाइल मौजूद नहीं है, तो इसके बजाय इसे बनाया जाएगा। यदि आप इसे फिर से उसी फ़ाइल पर चलाते हैं, तो केवल ">>" जानकारी को संक्षिप्त किया जाएगा। ">" के साथ आप बस पहले रन पर जो कुछ भी करते हैं उसे ओवरराइट कर देंगे।

लेकिन यहां आउटपुट फ़ाइल के रूप में समान इनपुट फ़ाइल का उपयोग करते समय सौदा होता है। उस विशेष स्थिति में, यदि आप ">" का उपयोग करते हैं, तो आप पार्स करने के लिए "इनपुट" भाग की जानकारी को हटा देंगे, क्योंकि आउटपुट फाइल "इसे ओवरराइट कर देगी"। तो में:

rev file.txt | cat > file.txt

"धीमी गति स्पष्टीकरण" में वास्तव में क्या हो रहा है:

  1. revकी सामग्री को उलटने के लिए तैयार करता है file.txtऔर इसे पाइप पर भेजता है
  2. revपाइप को जानकारी भेजते समय , पाइप सीधे इसे स्ट्रीम करता है cat
  3. catजानकारी प्राप्त करते समय यह स्वचालित रूप से उस पर लागू होगा जो file.txtइसके साथ सेट किया गया था।
  4. यहां कीवर्ड "जबकि" है, क्योंकि सब कुछ एक ही समय में हो रहा है। कृपया एमिल द्वारा नीचे दिए गए उत्कृष्ट टिप्पणियों को इस भाग पर गहराई से समझने के लिए देखें।
  5. catrevपूरी फ़ाइल को पाइप करने के लिए प्रतीक्षा नहीं करेगा । यह बस मिनट शुरू कर देगा सूचना का पहला भाग इसे प्राप्त करता है, जिसका अर्थ है कि आपने किस प्रतीक का उपयोग किया है, इसके आधार पर यह एक कनेक्शन खोल देगा file.txt
  6. इस मामले के बाद से आप इस्तेमाल किया > बजाय >> , खोल आउटपुट फ़ाइल जिसका मतलब है कि यह खुल जाएगा काटना होगा और स्पष्ट की जानकारी file.txtनई जानकारी के लिए इंतज़ार कर इसे पाने के लिए करते हैं। >> इसके साथ यह एक कनेक्शन खोलेगा file.txtऔर अंतिम पंक्ति की नई जानकारी की प्रतीक्षा करेगा।
  7. चूंकि जानकारी पहले से ही > केfile.txt साथ साफ हो गई थी , इसलिए यह काम करने की कोशिश करेगा और नई जानकारी के लिए तैयारी में सब कुछ हटा देने के कारण कुछ भी नहीं मिलेगा ।revcat

तो ऊपर पढ़कर बाकी लोग क्यों काम करते हैं। होने के कारण:

rev file.txt | cat > file2.txt && mv file.txt file2.txt

यहां आप बिल्ली को पाइप कर रहे हैं जो किसी अन्य फ़ाइल को जानकारी भेज रही है । इस स्थिति में, संसाधित इनपुट फ़ाइल file.txtआउटपुट फ़ाइल के समान नहीं है file2.txt। उसके बाद आप शाब्दिक रूप से संपूर्ण के file2.txtसाथ ओवरराइट कर रहे हैं file.txt, इसलिए द्वारा बनाई गई सभी प्रक्रिया catको हटा दिया गया था। मूल रूप से पूरी लाइन को सरल बनाया जा सकता है cp file.txt file2.txtक्योंकि यह एक ही काम कर रहा है क्योंकि file2.txtअंत में हारता है revऔर mvकमांड के साथ ओवरराइट किया जाता है ।

rev file.txt | cat >> file.txt

इस स्थिति में आप सूचना को उसी फ़ाइल में भेज रहे हैं । तो यह केवल कि फाइल करने के लिए एक कनेक्शन खोल रहा है, लेकिन के रूप में एक साथ देखा जानकारी मिटा नहीं > । अंतिम परिणाम, मूल जानकारी और उलट जानकारी होनी चाहिए।


5
फ़ाइल को बिल्ली द्वारा काट नहीं किया जाता है। यह शेल द्वारा छंटनी की जाती है, इससे पहले कि पाइपलाइन में कोई भी कमांड शुरू हो।
एमिल जेकाबेक

सही, समझाने के लिए आसान शब्दों की तलाश थी। चूंकि यह स्पष्ट करना थोड़ा कठिन है कि क्या ओपी को पता नहीं है कि यह क्या है और यह सब क्या है। इसे यथासंभव "अनुकूल" बनाने की कोशिश की जा रही है।
लुइस अल्वारादो

1
खैर, यह वास्तव में कोई फर्क नहीं पड़ता कि यह शेल द्वारा किया गया है, लेकिन यह कि आपके द्वारा प्रस्तुत समय गलत है। ट्रंकेशन चरण 6 में नहीं होगा, लेकिन चरण 0. rev file.txt | cat --bogus-option > file.txtमें फ़ाइल को भी काट दिया जाएगा, भले ही बिल्ली इसे खोलने का प्रयास नहीं करेगी।
एमिल जेकाबेक

@ EmilJe Emábek आप सही हैं। फिर भी उपयोगकर्ता जो यह नहीं जानते हैं कि यह कैसे व्यवहार करता है, यदि हम केवल कमांड के साथ कदम से कदम मिलाते हैं तो यह आसान होगा। साथ ही आपका उदाहरण अभी भी जानकारी को उसी फ़ाइल में भेज रहा है, इसलिए bash उस पूरी पंक्ति को पढ़ेगा, आउटपुट को देखेगा और फिर भी खुलेगा और उसे काट देगा। त्रुटि बस stderout करने के लिए stderr outputting है।
लुइस अल्वाराडो

4
मोरटिल्स भी देखें , टूल का एक शानदार संग्रह (पैकेज रिपॉजिटरी से उपलब्ध है moreutils) जिसमें spongeएक इनपुट फ़ाइल को अधिलेखित करने के लिए विशेष रूप से डिज़ाइन किया गया टूल शामिल है । उदाहरण के लिए, rev file.txt >file2.txt && mv file2.txt file.txtवर्कअराउंड बन जाएगा rev file.txt | sponge file.txt, जो पहले से ही कुछ नाम होने पर भी सही ढंग से काम करेगा file2.txt
डेनियल वैगनर

9

जब शेल पुनर्निर्देशन देखता है, तो इसमें शामिल किसी भी कमांड को निष्पादित करने से पहले, यह पहले संबंधित फाइलों को खोलता है। इस प्रकार, जब आप करते हैं:

foo file.txt | bar > file.txt

रीडायरेक्शन के file.txtकारण इसे पहले foo चलाया जा सकता है और इसे पढ़ा जा सकता है file.txt। एक साइड नोट पर, यही कारण है कि आप ऐसा नहीं कर सकते:

sed 'blah' file.txt > file.txt

और क्यों sedमें एक जगह संपादन विकल्प है।

अंत में, कर:

.. | cat > file.txt

बिल्ली का एक बेकार उपयोग है , खासकर यदि आप file.txtपहले से पढ़ने का प्रयास कर रहे हैं ।

यदि आप किसी फ़ाइल को इन-प्लेस में रिवर्स करना चाहते हैं , तो कोई शॉर्टकट नहीं हैं । आप इन-प्लेस संपादन के साथ sedया awkट्रिक्स का उपयोग करने में सक्षम हो सकते हैं ।


3

>एक पुनर्निर्देशक (ऑपरेटर) है जो आउटपुट को कुछ और भेजता है
(अगले कमांड, प्रिंटर का इनपुट ..)

आपके मामले में आउटपुट एक फ़ाइल में जाता है file.txt, अगर यह फ़ाइल पहले से मौजूद है तो इसे ओवरराइट किया गया है, अगर यह नहीं बनाया गया है।

>>एक परिशिष्ट ऑपरेटर है, यदि file.txtपहले से मौजूद आउटपुट फाइल के अंत में संलग्न है। यदि फ़ाइल मौजूद नहीं है तो इसे बनाया जाता है, और नई फ़ाइल में लिखा गया आउटपुट, उसी तरह >(पुनर्निर्देशक)।


ओपी को यह समझ में आ गया है। भ्रम केवल एक ही फ़ाइल से >और >>ऑपरेटरों के दोनों किनारों पर होने से लगता है ।
bzlm

0

आप पूर्व मोड में विम का उपयोग कर सकते हैं:

ex -sc '%!rev' -cx file.txt
  1. % सभी लाइनों का चयन करें

  2. ! चलाने के आदेश

  3. x सहेजें और बंद करें

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