Mam problem ze zrozumieniem dziwnego zachowania: vi wydaje się dodawać nową linię (ASCII: LF, ponieważ jest to system uniksowy ( AIX )) na końcu pliku, kiedy NIE specjalnie go wpisałem.
Plik jako taki edytuję w vi (uważając, aby nie wprowadzić nowego wiersza na końcu):
# 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.
Spodziewam się, że vi zapisze go „tak, jak jest”, więc powinien mieć 39 bajtów: 10 znaków ASCII w każdym z pierwszych trzech wierszy (cyfry od 1 do 9, po których następuje nowa linia (LF w moim systemie)) i tylko 9 w ostatnim linia (znaki od 1 do 9, bez kończącej nowej linii / LF).
Ale pojawia się, kiedy go zapisuję, ma 40 bajtów (zamiast 39), a od pokazuje końcowy 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?
Jeśli utworzę plik z printf, który robi dokładnie to, co zrobiłem w vi, działa zgodnie z oczekiwaniami:
# ## 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.
Oba pliki (foo (40 znaków) i foo2 (39 znaków) wyglądają dokładnie tak samo, jeśli ponownie je otworzę za pomocą vi ...
A jeśli otworzę foo2 (39 znaków, bez kończącego nowego wiersza) w vi i po prostu zrobię to :wq
bez edycji, to napisa , że zapisuje 40 znaków, i pojawia się wiersz!
Nie mogę uzyskać dostępu do nowszej wersji vi (robię to w systemie AIX, vi (nie w Vimie ) w wersji 3.10? Myślę, że (brak „-wersji” lub innych sposobów jej poznania)).
# strings /usr/bin/vi | grep -i 'version.*[0-9]'
@(#) Version 3.10
Czy to normalne, że vi (a może nie w nowszej wersji? Lub Vim?) Cicho dodaje nowy wiersz na końcu pliku? (Myślałem, że ~ wskazuje, że poprzednia linia NIE kończyła się nową linią).
-
Edycja: kilka dodatkowych aktualizacji i trochę podsumowania, wielkie dzięki poniższym odpowiedziom:
vi cicho dodaje końcowy znak nowej linii w momencie, gdy zapisuje plik, który go nie ma (chyba że plik jest pusty).
robi to tylko w momencie pisania! (tzn. dopóki nie w: możesz użyć: e, aby sprawdzić, czy plik jest nadal otwarty, gdy go otworzyłeś ... (tj .: nadal pokazuje „nazwę pliku” [ostatnia linia nie jest kompletna] N linia, znak M). Kiedy zapisujesz, nowy wiersz jest dodawany w trybie cichym, bez specjalnego ostrzeżenia (mówi, ile bajtów zapisuje, ale w większości przypadków to nie wystarczy, aby wiedzieć, że dodano nowy wiersz) (dzięki @jiliagre za rozmowę ze mną o otwierając komunikat vi, pomógł mi znaleźć sposób, aby wiedzieć, kiedy zmiana rzeczywiście nastąpi)
To (cicha korekta) jest zachowaniem POSIX ! (patrz odniesienia @ odpowiedź boso-io)
vi
wersję lub przynajmniej wskazówkę dotyczącą jej pochodzenia, uruchamiając :ve
polecenie.
ex
stronę podręcznika, na której :ver
polecenie jest zwykle dokumentowane.