J'ai du mal à comprendre un comportement étrange: vi semble ajouter une nouvelle ligne (ASCII: LF, car il s’agit d’un système Unix ( AIX )) à la fin du fichier, alors que je ne l’avais PAS spécifiquement écrit.
J'édite le fichier tel quel dans vi (en prenant soin de ne pas saisir de nouvelle ligne à la fin):
# 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.
J'espère que vi le sauvegardera "tel quel", donc 39 octets: 10 caractères ASCII sur chacune des trois premières lignes (numéros 1 à 9, suivis d'un saut de ligne (LF sur mon système)) et seulement 9 sur la dernière line (caractères 1 à 9, pas de nouvelle ligne / LF).
Mais il semble que lorsque je le sauvegarde il est de 40 octets (au lieu de 39), et od montre 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 je crée le fichier avec un printf faisant exactement ce que j'ai fait dans vi, cela fonctionnera comme prévu:
# ## 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.
Les deux fichiers (foo (40 caractères) et foo2 (39 caractères) apparaissent exactement de la même manière si je les rouvre avec vi ...
Et si j'ouvre foo2 (39 caractères, sans nouvelle ligne) dans vi et que je me contente de le :wq
modifier , il dit qu'il écrit 40 caractères et que le saut de ligne apparaît!
Je ne peux pas avoir accès à un vi plus récent (je le fais sous AIX, vi (pas Vim ) version 3.10 je pense? (Pas de "version" ou autre moyen de le savoir)).
# strings /usr/bin/vi | grep -i 'version.*[0-9]'
@(#) Version 3.10
Est-il normal que vi (et peut-être pas dans une version plus récente? Ou Vim?) Ajoute silencieusement une nouvelle ligne à la fin d'un fichier? (Je pensais que le ~ indiquait que la ligne précédente ne finissait pas par une nouvelle ligne.)
-
Edit: quelques mises à jour supplémentaires et un peu de résumé, avec un grand merci aux réponses ci-dessous:
vi ajoute silencieusement une nouvelle ligne au moment où il écrit un fichier qui en manque (sauf si le fichier est vide).
il ne le fait qu'au moment de l'écriture! (c.-à-d. jusqu'à ce que: w, vous puissiez utiliser: e pour vérifier que le fichier est toujours tel que vous l'avez ouvert ... (c.-à-d. qu'il affiche toujours "nom du fichier" [la dernière ligne n'est pas complète] N ligne, caractère M). Lorsque vous sauvegardez, une nouvelle ligne est ajoutée silencieusement, sans avertissement spécifique (le nombre d'octets sauvegardés est indiqué, mais dans la plupart des cas, cela ne suffit pas de savoir qu'une nouvelle ligne a été ajoutée) (merci à @jiliagre de m'avoir parlé de la En ouvrant le message vi, cela m’a aidé à trouver un moyen de savoir quand le changement se produit réellement)
Ceci (correction silencieuse) est le comportement POSIX ! (voir la réponse @ barefoot-io pour les références)
vi
version ou au moins un indice sur son origine en exécutant la :ve
commande.
ex
page de manuel où la :ver
commande est normalement documentée.