Tenho problemas para entender um comportamento estranho: o vi parece adicionar uma nova linha (ASCII: LF, pois é um sistema Unix ( AIX )) no final do arquivo, quando NÃO o digitei especificamente.
Eu edito o arquivo como tal no vi (tomando cuidado para não inserir uma nova linha no 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 o vi salve-o "como está", para ter 39 bytes: 10 caracteres ASCII em cada uma das três primeiras linhas (números 1 a 9, seguidos por uma nova linha (LF no meu sistema)) e apenas 9 nos últimos linha (caracteres de 1 a 9, sem nova linha / LF).
Mas parece que quando eu o salvo são 40 bytes (em vez de 39), e od mostra um 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?
Se eu criar o arquivo com um printf fazendo exatamente o que fiz no vi, ele funcionará conforme o esperado:
# ## 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 os arquivos (foo (40 caracteres) e foo2 (39 caracteres) aparecem exatamente iguais se eu os reabrir com vi ...
E se eu abrir foo2 (39 caracteres, sem nova linha final) no vi e simplesmente não :wq
precisar editá-lo , ele diz que escreve 40 caracteres e o feed de linha aparece!
Não posso ter acesso a um vi mais recente (eu faço isso no AIX, vi (não no Vim ) versão 3.10, acho? (Sem "versão" ou outro meio de conhecê-lo)).
# strings /usr/bin/vi | grep -i 'version.*[0-9]'
@(#) Version 3.10
É normal que o vi (e talvez não na versão mais recente? Ou o Vim?) Adicione silenciosamente uma nova linha no final de um arquivo? (Eu pensei que o ~ indicava que a linha anterior NÃO terminava com uma nova linha.)
-
Edit: algumas atualizações adicionais e um pouco de resumo, com um grande agradecimento às respostas abaixo:
O vi adiciona silenciosamente uma nova linha à direita no momento em que grava um arquivo que não possui (a menos que o arquivo esteja vazio).
só o faz no momento da escrita! (ou seja, até você: w, você pode usar: e para verificar se o arquivo ainda está como você o abriu ... (ou seja: ele ainda mostra "filename" [A última linha não está completa] N line, caractere M). Quando você salva, uma nova linha é adicionada silenciosamente, sem um aviso específico (indica quantos bytes ela salva, mas na maioria dos casos não é suficiente para saber que uma nova linha foi adicionada) (obrigado a @jiliagre por falar comigo sobre o abrindo a mensagem vi, isso me ajudou a encontrar uma maneira de saber quando a mudança realmente ocorre)
Essa (correção silenciosa) é um comportamento POSIX ! (veja @ barefoot-io answer para referências)
vi
versão ou pelo menos uma pista sobre sua origem executando o :ve
comando
ex
página do manual em que o :ver
comando normalmente está documentado.