Por que o redirecionamento para um loop while não imprime as mensagens?

1

Aqui está um código de shell usado para rastrear as alterações em um arquivo e gerar o conteúdo para o terminal:

while read LINE
do
  echo $LINE
done < 'tail -f /var/log/messages'

Não funciona, por quê?

    
por Searene 25.08.2015 / 09:03

2 respostas

5

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).  
    
por chaos 25.08.2015 / 09:22
0

A maneira comum de se fazer isso é:

tail -f /var/log/messages | while read LINE
do
  echo $LINE
done

@ resposta do caos está usando a sintaxe de substituição de processos, que só é encontrada em shells avançados, como zsh e bash . Você não deve confiar em seus recursos se precisar executar o script em um computador diferente.

Claro, suponho que você queira colocar algo mais complexo que echo $LINE no loop.

    
por oals 25.08.2015 / 15:44