Tuhaf bir davranışı anlamakta zorluk çekiyorum: vi, özellikle yazmamış olduğumda, dosyanın sonuna yeni bir satır (ASCII: LF, Unix ( AIX ) sistemi olduğu için) ekliyor gibi görünüyor ).
Dosyayı vi olarak düzenlerim (sonunda yeni bir satır girmemeye dikkat ederek):
# 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.
Vi'nin "olduğu gibi" kaydetmesini bekliyorum, böylece 39 bayt var: ilk üç satırın her birinde 10 ASCII karakter (sayıları 1'den 9'a, ardından yeni bir satır (sistemimde LF)) ve yalnızca 9'undan satır (1'den 9'a kadar olan karakterler, yeni satır / sonlandırıcı yok).
Ama kaydettiğimde 40 bayt (39 yerine) ve od sonlandırıcı bir LF gösteriyor :
# 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?
Dosyayı vi ile yaptıklarımı aynen yapan bir printf ile oluşturursam, beklendiği gibi çalışır:
# ## 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.
Her iki dosya da (foo (40 karakter) ve foo2 (39 karakter) vi ile tekrar açtığımda aynı görünür ...
Ve eğer foo2'yi (39 karakter, sonlandırma yeni satırı yok) vi'de açarsam ve sadece :wq
herhangi bir düzenleme yapmadan yaparsam , 40 karakter yazdığını ve satır çekimi ortaya çıktığını söyler!
Daha yeni bir vi'ye erişemiyorum ( bunu AIX, vi ( Vim değil ) sürüm 3.10'da yapıyorum, sanırım? ("-Versiyon" veya bunu bilmenin başka yolları yoktur).
# strings /usr/bin/vi | grep -i 'version.*[0-9]'
@(#) Version 3.10
Bir dosyanın sonuna sessizce yeni bir satır eklemek vi (ve belki de daha yeni sürümde değil mi? Vim?) Normal midir? (Bence ~, önceki satırın yeni satırla bitmediğini belirtti.)
-
Düzenleme: bazı ek güncellemeler ve bir özeti, aşağıdaki cevaplar sayesinde büyük:
vi, bulunmayan bir dosyayı yazdığı anda sessizce yeni bir satır ekleyin (dosya boş değilse).
bu sadece yazma zamanında yapar! (yani, siz: w'ye kadar: e dosyasını, dosyayı açtığınız gibi hala doğrulamak için kullanabilirsiniz ... (yani: yine de "dosya adı" nı gösterir [Son satır tamamlanmadı] N satırı, M karakteri). Kaydettiğinizde, yeni bir satır belirli bir uyarı vermeden sessizce eklenir (kaç bayt kazandırdığını söyler, ancak bu çoğu durumda yeni bir satır eklendiğini bilmek için yeterli değildir) (benimle ilgili konuştuğunuz için jiliagre sayesinde vi mesajı açarak, değişikliğin gerçekten ne zaman gerçekleştiğini bilmek için bir yol bulmamda bana yardımcı oldu.
Bu (sessiz düzeltme) POSIX davranışıdır! (referanslar için @ yalınayak-io cevabına bakınız)
vi
çalıştırarak sürümü veya en azından kökeniyle ilgili bir ipucu elde edebilirsiniz :ve
.
ex
kılavuz sayfasını çıkardı :ver
.