यह आदेश एक बहुत बड़ी फ़ाइल क्यों बनाता है?


19

मैं आज कुछ परिशिष्ट संचालन के साथ प्रयोग कर रहा था और, मेरी जिज्ञासा में, इसे चलाया (जहाँ file1.txt गैर-रिक्त था और file2.txt खाली था):

$ cat file1.txt >> file2.txt >> file1.txt

जब मैंने इसे थोड़ी देर लेते देखा, तो मैंने इसे खत्म करने के लिए Ctrl+ मारा C। तब तक, file1.txt का आकार सैकड़ों MB था।

फ़ाइल नामों को स्विच करना समान प्रभाव उत्पन्न नहीं करता है; केवल जब फ़ाइलें इस क्रम में होती हैं तो अनंत पुनर्निर्देशन होता है। क्या वास्तव में यह कारण बनता है?

जवाबों:


24

आप catइस तरह से कई मानक का उपयोग करने के लिए नहीं कह सकते हैं , अंतिम पुनर्निर्देशन की पूर्वता लेता है:

cat file1.txt >> file2.txt >> file1.txt

के बराबर है:

>> file2.txt ; cat file1.txt >> file1.txt

जो स्पष्ट रूप से फाइल सिस्टम को जल्दी से भर देता है, इस तथ्य को देखते हुए कि स्रोत फाइल गंतव्य भी अनिश्चित रूप से बढ़ती है, बशर्ते file1.txtकि एक बार में पढ़ा न जाए।

अधिकांश आधुनिक catकार्यान्वयनों को पुनरावृत्ति और गर्भपात का पता लगाना चाहिए:

सोलारिस बिल्ली:

cat: input/output files 'file1.txt' identical

गुन्नू बिल्ली:

cat: file1.txt: input file is output file

वे वैसे भी कुछ के साथ बेवकूफ बनाया जा सकता है:

cat < file1.txt | cat | cat  >> file2.txt >> file1.txt

एक अच्छा बिल्लियों का इतना बेकार उपयोग नहीं ...


19
यह बहुत सारी बिल्लियों, म्याऊ है।
slm

2
आपने मेरा सिर स्पिन कराया लेकिन आपने मेरे सवाल का जवाब दिया!
मैट

7
और जब मैंने Google+ पर इस बारे में पूछा (उत्तर नहीं मिला), तो इसने स्वचालित रूप से #Cat और #Caturday के
मैट

3

मैं इसे बैश शेल में पुन: पेश करने में सक्षम नहीं था:

# non-empty file1
$ echo 1 > file1.txt

$ cat file1.txt >> file2.txt >> file1.txt 
cat: file1.txt: input file is output file

1 फ़ाइल 0 लंबाई के साथ बनाई जाती है, लेकिन फिर मुझे उपरोक्त संदेश मिलता है:

$ ls -l
total 4
-rw-rw-r-- 1 saml saml   2 Sep 10 19:35 file1.txt
-rw-rw-r-- 1 saml saml   0 Sep 10 19:35 file2.txt

@ Jlliagre के उत्तर के आधार पर मुझे यकीन नहीं है कि मुझे 2 फाइलें क्यों मिल रही हैं। यह catकार्यान्वयन पर निर्भर हो सकता है ।

EDIT # 1

@jlliagre ने इस कोड को दिखाने के लिए अपना उत्तर अपडेट किया, जिसे वह समकक्ष बताता है:

>> file2.txt ; cat file1.txt >> file1.txt

इसलिए अब मुझे पता है कि मैं खाली क्यों हूं file2.txt। यह धारणा कानूनी है:

>> file2.txt

और एक खाली फाइल बनाएगा।


file1.txtगैर-खाली शुरू करने के साथ फिर से प्रयास करें ।
गिल्स एसओ- बुराई को रोकना '

@ गिल्स - मैंने बस फिर से पढ़ा और उस पर ध्यान दिया, क्या मुझे कुछ अलग देखना चाहिए, मुझे अभी भी त्रुटि मिलती है? या आप केवल यह कह रहे हैं कि मेरे उत्तर में b / c का उदाहरण गलत है? मैंने जवाब बीटीडब्ल्यू तय किया।
slm

@ गिल्स - वह आपका डाउनवॉट था, नहीं? क्या यह केवल कुछ विशिष्ट या उत्तर के मूल्य की कमी के लिए है?
slm

1
निश्चित नहीं है कि आपके उत्तर को क्यों वोट दिया गया था, उत्तर देने से पहले अनुभव करने के लिए +1, कुछ ऐसा जो मैंने खुद नहीं किया ...
jlliagre

+1; आपके प्रयोग के लिए धन्यवाद! मैं रीडायरेक्ट और catव्यवहार को बेहतर तरीके से समझने लगा हूं ।
मैट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.