Saya mengalami kesulitan memahami perilaku aneh: vi tampaknya menambahkan baris baru (ASCII: LF, karena ini adalah sistem Unix ( AIX )) di akhir file, ketika saya TIDAK secara spesifik mengetiknya.
Saya mengedit file seperti itu di vi (berhati-hati untuk tidak memasukkan baris baru di akhir):
# 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.
Saya berharap vi untuk menyimpannya "sebagaimana adanya", sehingga memiliki 39 byte: 10 karakter ASCII pada masing-masing dari tiga baris pertama (angka 1 hingga 9, diikuti oleh baris baru (LF pada sistem saya)) dan hanya 9 pada yang terakhir baris (karakter 1 hingga 9, tidak ada penghentian baris baru / LF).
Tapi itu muncul ketika saya menyimpannya 40 byte (bukan 39), dan od menunjukkan LF terminating :
# 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?
Jika saya membuat file dengan printf melakukan apa yang saya lakukan di dalam vi, itu berfungsi seperti yang diharapkan:
# ## 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.
Kedua file (foo (40 karakter) dan foo2 (39 karakter) tampak persis sama jika saya membukanya kembali dengan ...
Dan jika saya membuka foo2 (39 karakter, tidak ada penghentian baris baru) di vi dan hanya melakukan :wq
tanpa mengeditnya , ia mengatakan itu menulis 40 karakter, dan linefeed muncul!
Saya tidak dapat memiliki akses ke vi yang lebih baru (saya melakukan ini pada AIX, vi (bukan Vim ) versi 3.10 saya pikir? (Tidak ada "-versi" atau cara lain untuk mengetahuinya)).
# strings /usr/bin/vi | grep -i 'version.*[0-9]'
@(#) Version 3.10
Apakah normal untuk vi (dan mungkin tidak dalam versi yang lebih baru? Atau Vim?) Untuk menambahkan baris baru secara diam-diam di akhir file? (Saya pikir ~ mengindikasikan bahwa baris sebelumnya TIDAK diakhiri dengan baris baru.)
-
Sunting: beberapa pembaruan tambahan dan sedikit ringkasan, dengan banyak terima kasih atas jawaban di bawah ini:
vi secara diam-diam menambahkan baris baru pada saat itu menulis file yang tidak memilikinya (kecuali file kosong).
itu hanya terjadi pada saat penulisan! (yaitu, sampai Anda: w, Anda dapat menggunakan: e untuk memverifikasi bahwa file tersebut masih saat Anda membukanya ... (yaitu: itu masih menunjukkan "nama file" [Baris terakhir tidak lengkap] N baris, karakter M). Ketika Anda menyimpan, baris baru ditambahkan secara diam-diam, tanpa peringatan khusus (ia mengatakan berapa banyak byte yang disimpannya, tetapi dalam kebanyakan kasus tidak cukup untuk mengetahui baris baru ditambahkan) (terima kasih kepada @jiliagre karena berbicara dengan saya tentang membuka pesan vi, itu membantu saya menemukan cara untuk mengetahui kapan perubahan itu benar-benar terjadi)
Ini (koreksi diam-diam) adalah perilaku POSIX ! (lihat jawaban @ barefoot-io untuk referensi)
vi
versi atau setidaknya petunjuk tentang asalnya dengan menjalankan :ve
perintah.
ex
halaman buku panduan tempat :ver
perintah biasanya didokumentasikan.