A última linha de comando no shell script sem uma nova linha

2

Por que a última linha de comando no script shell ( uptime below) 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#
    
por lylklb 06.06.2018 / 16:42

1 resposta

3

Quando o shell lê o script de shell, seu código de varredura aceita a última palavra no final do script, mesmo que não exista uma nova linha final.

Este é o efeito da primeira regra no padrão POSIX sobre como o shell deve reconhecer tokens em sua entrada :

If the end of input is recognized, the current token (if any) shall be delimited.

O fato de dizer que o token atual é delimitado aqui significa que a última palavra no script, juntamente com o restante dessa linha não terminada, será aceita como entrada para o intérprete, em vez de causar um erro ou colocar o shell em um estado indefinido.

Nos comentários, é feita uma referência ao editor vi . Um editor padrão vi tem permissão para editar um arquivo cuja última linha não seja terminada por uma nova linha. No entanto, ele terminará a última linha do buffer com uma nova linha ao gravá-la em um arquivo (exceto ao salvar um arquivo vazio, caso em que incluir uma nova linha será explicitamente não permitido). Isso também é verdade para um editor padrão ex :

INPUT FILES

Input files shall be text files or files that would be text files except for an incomplete last line that is not longer than {LINE_MAX}-1 bytes in length and contains no NUL characters. By default, any incomplete last line shall be treated as if it had a trailing <newline>. The editing of other forms of files may optionally be allowed by ex implementations.

O editor vim tem uma configuração, eol , que determina se deve preservar a última linha não terminada ou não. O comportamento padrão é finalizar a última linha. Veja :help eol em vim .

A entrada para o editor padrão ed deve ser um arquivo de texto, o que significa que o que acontece se você estiver editando um arquivo cuja última linha não foi terminada corretamente (o que não faz com que seja um arquivo de texto) não é tecnicamente especificado . No OpenBSD, o editor ed dirá "newline appended" ao abrir um arquivo de texto não finalizado.

INPUT FILES

The input files shall be text files.

    
por 06.06.2018 / 16:47