Tengo problemas para entender un comportamiento extraño: vi parece agregar una nueva línea (ASCII: LF, ya que es un sistema Unix ( AIX )) al final del archivo, cuando NO lo escribí específicamente.
Edito el archivo como tal en vi (teniendo cuidado de no ingresar una nueva línea al final):
# 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.
Espero que vi lo guarde "como está", para tener 39 bytes: 10 caracteres ASCII en cada una de las tres primeras líneas (números 1 a 9, seguidos de una nueva línea (LF en mi sistema)) y solo 9 en la última línea (caracteres 1 a 9, sin línea nueva terminada / LF).
Pero aparece cuando lo guardo es de 40 bytes (en lugar de 39), y od muestra un LF final :
# 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?
Si creo el archivo con un printf haciendo exactamente lo que hice dentro de vi, funciona como se esperaba:
# ## 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.
Ambos archivos (foo (40 caracteres) y foo2 (39 caracteres) aparecen exactamente iguales si los vuelvo a abrir con vi ...
Y si abro foo2 (39 caracteres, sin nueva línea de terminación) en vi y simplemente lo hago :wq
sin editarlo , dice que escribe 40 caracteres, ¡y aparece el salto de línea!
No puedo tener acceso a un vi más reciente (lo hago en AIX, vi (no en Vim ) versión 3.10, creo? (No "versión" u otro medio para saberlo)).
# strings /usr/bin/vi | grep -i 'version.*[0-9]'
@(#) Version 3.10
¿Es normal que vi (y tal vez no en una versión más reciente o Vim) agregue en silencio una nueva línea al final de un archivo? (Pensé que ~ indicaba que la línea anterior NO terminaba con una nueva línea).
-
Editar: algunas actualizaciones adicionales y un poco de resumen, con un gran agradecimiento a las respuestas a continuación:
vi agrega silenciosamente una nueva línea final en el momento en que escribe un archivo que le faltaba (a menos que el archivo esté vacío).
¡solo lo hace al momento de escribir! (es decir, hasta que: w, puede usar: e para verificar que el archivo todavía está tal como lo abrió ... (es decir: todavía muestra "nombre de archivo" [Última línea no está completa] Línea N, carácter M). Cuando guarda, se agrega una nueva línea de forma silenciosa, sin una advertencia específica (dice cuántos bytes guarda, pero en la mayoría de los casos esto no es suficiente para saber que se agregó una nueva línea) (gracias a @jiliagre por hablar conmigo sobre el abriendo el mensaje vi, me ayudó a encontrar una manera de saber cuándo ocurre realmente el cambio)
¡Esta (corrección silenciosa) es un comportamiento POSIX ! (ver la respuesta @ barefoot-io para referencias)
vi
versión o al menos una pista sobre su origen ejecutando el :ve
comando.
ex
página del manual donde :ver
normalmente se documenta el comando.