Como o parâmetro “-f” do comando “tail” funciona?

54
$ tail -f testfile

o comando deve mostrar as entradas mais recentes no arquivo especificado, em tempo real, certo? Mas isso não está acontecendo. Por favor, corrija-me, se o que eu pretendo fazer é errado ...

Eu criei um novo arquivo "aaa", adicionei uma linha de texto e a fechei. então emitiu este comando (primeira linha):

$ tail -f aaa
xxx
xxa
axx

as últimas três linhas são o conteúdo do arquivo aaa. Agora que o comando ainda está em execução (já que usei -f ), abri o arquivo aaa através da GUI e comecei a adicionar mais algumas linhas manualmente. Mas o terminal não mostra as novas linhas adicionadas no arquivo.

O que há de errado aqui? O comando tail -f mostra apenas novas entradas se elas forem escritas somente pelo sistema? (como arquivos de log, etc)

    
por its_me 15.08.2011 / 03:45

3 respostas

57

Na página de manual tail(1) :

   With  --follow  (-f),  tail  defaults to following the file descriptor,
   which means that even if a tail’ed file is renamed, tail will  continue
   to  track  its  end.   This  default behavior is not desirable when you
   really want to track the actual name of the file, not the file descrip-
   tor (e.g., log rotation).  Use --follow=name in that case.  That causes
   tail to track the named file  in  a  way  that  accommodates  renaming,
   removal and creation.

Seu editor de texto está renomeando ou excluindo o arquivo original e salvando o novo arquivo com o mesmo nome de arquivo. Use -F em vez disso.

    
por 15.08.2011 / 04:07
10

Seu editor tem seu próprio buffer para o arquivo. Quando você modifica o texto no editor, nada é gravado no próprio arquivo.

Quando você salva suas alterações, é provável que o editor simplesmente exclua o arquivo antigo e crie um novo. tail -f ainda estará conectado ao arquivo excluído, por isso não mostrará nada de novo.

    
por 15.08.2011 / 04:09
3

tail "atualizar" a cada 1 segundo por padrão, não em tempo real.

Tente com isso (você precisa de bash4):

  • Abra 2 terminais.
  • No primeiro terminal, execute touch ~/output.txt e tail -f ~/output.txt .
  • No segundo terminal, execute for i in {0..100}; do sleep 2; echo $i >> ~/output.txt ; done
  • Observe a saída da cauda no primeiro terminal.
por 15.08.2011 / 04:07