Ich habe Probleme, ein seltsames Verhalten zu verstehen: vi scheint eine neue Zeile (ASCII: LF, da es sich um ein Unix- System ( AIX ) handelt) am Ende der Datei hinzuzufügen , als ich sie NICHT speziell eingegeben habe.
Ich bearbeite die Datei als solche in vi (achte darauf, dass du am Ende keine neue Zeile eingibst):
# 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.
Ich erwarte, dass vi es "so wie es ist" speichert, um 39 Bytes zu haben: 10 ASCII-Zeichen in jeder der ersten drei Zeilen (Nummern 1 bis 9, gefolgt von einer neuen Zeile (LF auf meinem System)) und nur 9 in der letzten Zeile (Zeichen 1 bis 9, kein abschließender Zeilenumbruch / LF).
Aber es erscheint, wenn ich es speichere, es ist 40 Bytes (anstelle von 39), und od zeigt ein abschließendes LF :
# 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?
Wenn ich die Datei mit einem printf erstelle, der genau das tut, was ich in vi getan habe, funktioniert es wie erwartet:
# ## 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.
Beide Dateien (foo (40 Zeichen) und foo2 (39 Zeichen) sehen genauso aus, wenn ich sie mit vi ...
Und wenn ich foo2 (39 Zeichen, kein abschließender Zeilenumbruch) in vi öffne und einfach auf die :wq
Bearbeitung verzichte, werden 40 Zeichen geschrieben und der Zeilenvorschub wird angezeigt!
Ich kann nicht auf ein neueres vi zugreifen (ich mache das unter AIX, vi (nicht Vim ) Version 3.10, glaube ich? (Keine "-version" oder andere Mittel, um es zu wissen)).
# strings /usr/bin/vi | grep -i 'version.*[0-9]'
@(#) Version 3.10
Ist es normal, dass vi (und möglicherweise nicht in einer neueren Version? Oder Vim?) Am Ende einer Datei stillschweigend eine neue Zeile hinzufügt? (Ich dachte, das ~ deutet darauf hin, dass die vorherige Zeile NICHT mit einer neuen Zeile endet.)
-
Bearbeiten: einige zusätzliche Updates und eine kleine Zusammenfassung, mit großem Dank an die Antworten unten:
vi Fügen Sie stillschweigend eine abschließende Zeile hinzu, wenn eine Datei geschrieben wird, der diese fehlte (es sei denn, die Datei ist leer).
Dies geschieht nur zum Zeitpunkt des Schreibens! (dh, bis Sie: w, können Sie: e verwenden, um zu überprüfen, ob die Datei noch in dem Zustand ist, in dem Sie sie geöffnet haben ... (dh, es wird immer noch "Dateiname" angezeigt. [Letzte Zeile ist nicht vollständig.] N Zeile, M Zeichen). Wenn Sie speichern, wird eine neue Zeile stillschweigend ohne besondere Warnung hinzugefügt (es wird zwar angegeben, wie viele Bytes gespeichert werden, dies reicht jedoch in den meisten Fällen nicht aus, um zu wissen, dass eine neue Zeile hinzugefügt wurde) (danke an @jiliagre, dass Sie mit mir über das gesprochen haben Nachdem ich die vi-Nachricht geöffnet habe, habe ich herausgefunden, wann die Änderung tatsächlich eintritt.
Dies (stille Korrektur) ist POSIX- Verhalten! (Referenzen finden Sie unter @ barefoot-io answer)
vi
Version oder zumindest einen Hinweis auf die Herkunft erhalten, indem Sie den :ve
Befehl ausführen.
ex
Handbuchseite entfernt, auf der der :ver
Befehl normalerweise dokumentiert ist.