'tail' comando não obtendo apenas as novas linhas

4

Estou usando o comando:

tail -f -n 0 file.txt

Mas continua repetindo-se.

  1. O que estou fazendo é o seguinte:

  2. Crie o arquivo no primeiro terminal: touch file.txt

  3. Inicie a cauda no segundo terminal: tail -f -n 0 file.txt

  4. Edite o arquivo no primeiro terminal: nano file.txt

  5. Basta adicionar text , salvar e fechar. O segundo terminal gera text como deveria.

  6. Edite o arquivo novamente no primeiro terminal: nano file.txt

  7. Adicione no final (segunda linha) more text , salve e feche. O segundo terminal gera:

  

tail: file.txt: arquivo truncado
     texto
     mais texto

Edite o arquivo novamente no primeiro terminal: nano file.txt

Adicione no final (3ª linha) even more text , salve e feche. O segundo terminal gera even more text como deveria.

Edite o arquivo novamente no primeiro terminal: nano file.txt

Adicione no final (4ª linha) and even more text , salve e feche. O segundo terminal gera:

tail: file.txt: file truncated
text
more text
even more text
and even more text

Eu preciso do comando para não se repetir.

A saída resultou em:

tail -f -n 0 file.txt
text
tail: file.txt: file truncated
text
more text
even more text
tail: file.txt: file truncated
text
more text
even more text
and even more text

E eu preciso disso para a saída:

tail -f -n 0 file.txt
text
more text
even more text
and even more text

Ou, se não for possível remover a mensagem "arquivo truncado", algo como:

tail -f -n 0 file.txt
text
tail: file.txt: file truncated
more text
even more text
tail: file.txt: file truncated
and even more text

Eu também não sei porque dá a mensagem truncada do arquivo. Eu começo a inserir o novo texto no final do arquivo.

    
por Edu 06.04.2014 / 17:51

2 respostas

13

Primeiro, você recebe o erro porque está usando um editor de texto para isso. Isso significa que toda vez que você abrir o arquivo, editá-lo e salvá-lo, o original será substituído pelo novo conteúdo. Se você adicionou uma única linha ao final ou 100 linhas em todo o lugar é irrelevante, o ponto é que o arquivo está sendo aberto, editado e salvo e que sobrescreve o conteúdo.

Por exemplo, compare seu fluxo de trabalho para executar isso:

for((i=0;i<20;i++)); do echo $i >> file.txt; sleep 1; done

Isso gravará um número em file.txt a cada segundo por vinte segundos. Se você abrir outro terminal e executar tail -fn 0 file.txt , verá a saída esperada.

Assim, para obter o comportamento desejado, adicione o texto ao arquivo usando >> de um terminal, em vez de editá-lo manualmente.

Mais detalhes

nano parece ser o estranho aqui fora. A maioria dos editores ao abrir um arquivo e salvá-lo, na verdade, excluirá o arquivo original e salvará um novo com o mesmo nome. Você pode testar isso verificando o número do inode do arquivo:

$ ls -il file.txt
16647801 -rw-r--r-- 1 terdon terdon 9 Apr  6 18:19 file.txt

Os arquivos são simplesmente hardlinks para inodes específicos, neste caso, file.txt aponta para inode 16647801 . Agora, abra o arquivo em gedit , adicione uma linha e verifique o inode novamente:

$ gedit file.txt
$ ls -il file.txt
16647854 -rw-r--r-- 1 terdon terdon 13 Apr  6 18:23 file.txt

Como você pode ver, o número do inode foi alterado, em outras palavras, o arquivo original foi removido e um novo foi criado. nano não faz isso, tentando a mesma coisa com nano não altera o inode. No entanto, exclui o conteúdo original, sobrescrevendo-os com o novo conteúdo. É por isso que tail mostra a saída, se você tentar e editar o arquivo com gedit (ou emacs ou vários outros editores), as linhas extras adicionadas não serão mostradas na saída de tail de todo.

    
por terdon 06.04.2014 / 18:26
7

Como afirmado em uma das outras respostas, isso está acontecendo porque o arquivo está sendo sobregravado sempre que você salva o arquivo. O comando tail foi projetado para monitorar arquivos de log nos quais novas linhas são anexadas ao arquivo.

Nesta situação específica, usaria o seguinte como solução alternativa:

watch -n 1 cat file.txt

O comando watch executa um comando periodicamente. O intervalo de atualização, em segundos, é especificado com -n e pode ser ajustado ao seu gosto.

    
por nullmem 06.04.2014 / 18:26