मुझे एक अजीब व्यवहार को समझने में परेशानी होती है: vi फ़ाइल की समाप्ति पर एक नई पंक्ति (ASCII: LF, जोड़ते हैं क्योंकि यह एक यूनिक्स ( AIX ) प्रणाली है, जब मैंने विशेष रूप से इसे टाइप नहीं किया था।
मैं फ़ाइल को vi में संपादित करता हूं (इस बात का ध्यान रखता हूं कि अंत में कोई नई इनपुट न डालें):
# vi foo ## Which I will finish on the char "9" and not input a last newline, then `:wq`
123456789
123456789
123456789
123456789
~
~
## When I save, the cursor is just above the last "9", and no newline was added.
मुझे उम्मीद है कि वीआई इसे "जैसा है", वैसे ही 39 बाइट्स होने की उम्मीद है: पहली तीन पंक्तियों में से प्रत्येक पर 10 ASCII वर्ण (संख्या 1 से 9, इसके बाद एक नई पंक्ति (मेरे सिस्टम पर LF)) और अंतिम पर केवल 9 लाइन (अक्षर 1 से 9, कोई समाप्ति वाली नई पंक्ति / LF) नहीं।
लेकिन ऐसा प्रतीत होता है जब मैं इसे सहेजता हूं तो यह 40 बाइट्स (39 के बजाय) है, और ओडी एक समाप्तिकारी एलएफ दिखाता है :
# wc foo
4 4 40 foo ## I expected 39 here! as I didn't add the last newline
# od -a toto
0000000 1 2 3 4 5 6 7 8 9 lf 1 2 3 4 5 6
0000020 7 8 9 lf 1 2 3 4 5 6 7 8 9 lf 1 2
0000040 3 4 5 6 7 8 9 lf
0000050
## An "lf" terminates the file?? Did vi add it silently?
अगर मैं एक प्रिंटफ के साथ फाइल बनाता हूं, जो मैंने vi के अंदर किया है, तो यह उम्मीद के मुताबिक काम करता है:
# ## I create a file with NO newline at the end:
# printf "123456789\n123456789\n123456789\n123456789" > foo2
# wc foo2 ## This one is as expected: 39 bytes, exactly as I was trying to do above with vi.
3 4 39 foo ## As expected, as I didn't add the last newline
## Note that for wc, there are only three lines!
## (So wc -l doesn't count lines; it counts the [newline] chars... Which is rather odd.)
# root@SPU0WMY1:~ ## od -a foo2
0000000 1 2 3 4 5 6 7 8 9 lf 1 2 3 4 5 6
0000020 7 8 9 lf 1 2 3 4 5 6 7 8 9 lf 1 2
0000040 3 4 5 6 7 8 9
0000047 ## As expected, no added LF.
दोनों फ़ाइलें (foo (40 अक्षर) और foo2 (39 अक्षर) बिल्कुल एक जैसी दिखाई देती हैं अगर मैं उन्हें vi के साथ फिर से खोलूं ...
और अगर मैं vi में foo2 (39 अक्षर, कोई समाप्त करने वाली नई पंक्ति) नहीं खोलता हूं और इसे संपादित किए बिना करता हूं:wq
, तो यह कहता है कि यह 40 वर्ण लिखता है, और लाइनफीड दिखाई देता है!
मेरे पास हाल ही के vi (IIX, vi (not Vim ) संस्करण 3.10 मैं ऐसा सोचता हूं पर ऐसा नहीं कर सकता हूं। मैं (कोई "-वर्जन" या इसे जानने के अन्य साधन नहीं)।
# strings /usr/bin/vi | grep -i 'version.*[0-9]'
@(#) Version 3.10
क्या यह vi के लिए सामान्य है (और शायद अधिक हाल के संस्करण में नहीं? या विम?) चुपचाप एक फ़ाइल के अंत में एक नई पंक्ति जोड़ने के लिए? (मुझे लगता है कि ~ ने संकेत दिया कि पिछली पंक्ति एक नई रेखा के साथ समाप्त नहीं हुई थी।)
-
संपादित करें: कुछ अतिरिक्त अपडेट और सारांश, नीचे दिए गए उत्तर के लिए एक बड़े धन्यवाद के साथ:
vi चुपचाप उस समय एक अनुगामी नई पंक्ति जोड़ते हैं, जिसमें एक फ़ाइल होती है जिसमें इसकी कमी होती है (जब तक कि फ़ाइल खाली न हो)।
यह केवल लेखन समय पर ऐसा करता है! (यानी, जब तक आप: डब्ल्यू, आप उपयोग कर सकते हैं: ई यह सत्यापित करने के लिए कि फ़ाइल अभी भी है जैसा कि आपने इसे खोला है ... (यानी: यह अभी भी "फ़ाइल नाम" दिखाता है [अंतिम पंक्ति पूरी नहीं है] एन लाइन, एम चरित्र)। जब आप सहेजते हैं, तो एक नई चेतावनी चुपचाप जोड़ी जाती है, एक विशिष्ट चेतावनी के बिना (यह कहता है कि यह कितने बाइट्स बचाता है, लेकिन यह ज्यादातर मामलों में एक नई रेखा को जोड़ने के लिए पर्याप्त नहीं है) (मेरे बारे में बात करने के लिए @jiliagre के लिए धन्यवाद) vi संदेश को खोलने से, मुझे यह जानने में मदद मिली कि परिवर्तन वास्तव में कब होगा)
यह (मौन सुधार) POSIX व्यवहार है! (संदर्भों के लिए @ नंगे पांव देखें)
vi
चलाकर इसके मूल के बारे में संस्करण या कम से कम एक सुराग प्राप्त करने में सक्षम हो सकते हैं :ve
।
ex
मैनुअल पेज को नीचे कर दिया, जहां :ver
कमांड को सामान्य रूप से प्रलेखित किया जाता है।