Por que a última linha de comando no script de shell ( uptime
abaixo) pode ser executada com sucesso sem a nova linha no final do arquivo?
Por exemplo:
root@jcdb:/tmp#
root@jcdb:/tmp#
root@jcdb:/tmp# cat dp
date
pwd
uptimeroot@jcdb:/tmp#
root@jcdb:/tmp#
root@jcdb:/tmp#
root@jcdb:/tmp# ./dp
Wed Jun 6 16:27:26 EAT 2018
/tmp
4:27pm up 1 day, 17:25, 2 users, load average: 0.39, 0.40, 0.41
root@jcdb:/tmp#
root@jcdb:/tmp#
Quando o shell lê o script do shell, seu código de varredura aceitará a última palavra no final do script, mesmo que não haja uma nova linha final.
Este é o efeito da primeira regra no padrão POSIX sobre como o shell deve reconhecer tokens em sua entrada :
O fato de dizer que o token atual é delimitado aqui significa que a última palavra no script, junto com o restante dessa linha não terminada, será aceita como entrada para o interpretador, em vez de causar um erro ou colocar o shell em um estado indefinido.
Nos comentários, é feita referência ao
vi
editor. Umvi
editor padrão pode editar um arquivo cuja última linha não seja terminada por uma nova linha. No entanto, terminará a última linha do buffer com uma nova linha ao gravá-la no arquivo (exceto ao salvar um arquivo vazio, caso em que a adição de uma nova linha não é explicitamente permitida). Isso também é verdade para umex
editor padrão:O
vim
editor tem uma configuração,eol
, que determina se deve ou não preservar a última linha não terminada. O comportamento padrão é encerrar a última linha. Veja:help eol
emvim
.A entrada para o
ed
editor padrão deve ser um arquivo de texto, o que significa que o que acontece se alguém está editando um arquivo cuja última linha não é terminada corretamente (o que o torna não um arquivo de texto) é tecnicamente não especificado. No OpenBSD, oed
editor dirá "nova linha anexada" ao abrir um arquivo de texto não terminado.