Não há necessidade de um loop while. Você tenta fazer duas vezes o mesmo. Além disso, o arquivo /var/log/messages
não está mais presente no Ubuntu.
Use apenas:
tail -f /var/log/syslog
para acompanhar o novo conteúdo adicionado no final do arquivo de texto. Se algo novo for escrito no final de /var/log/syslog
, ele será impresso no seu terminal.
Edit: Por que o comando na pergunta não funciona:
Primeiro, é claro que /var/log/messages
não existe. Mas se existir, o comando entre backticks é executado e substituído por sua saída (menos os caracteres de nova linha à direita). Portanto, a saída de tail -f ...
seria considerada como nome do arquivo para o redirecionamento de entrada <
. O que você provavelmente deseja seria o seguinte (o redirecionamento <(...)
):
while read LINE; do
echo $LINE
done < <(tail -f /var/log/messages)
O redirecionamento <(...)
cria um canal nomeado, onde em uma extremidade o comando tail -f
grava em. No outro extremo, o loop while
lê o conteúdo linha por linha. Um pipe nomeado se comporta como um arquivo comum. É apenas uma peça de conexão entre dois comandos. BTW, o |
faz exatamente o mesmo, mas esses canais não são nomeados, eles são os canais padrão: 0 - > stdin, 1 - > stdout e 2 - > stderr.
Na% man_de% manpage:
Process substitution is supported on systems that support named pipes (FIFOs) or the
/dev/fd method of naming open files. It takes the form of <(list) or >(list).