J'utilise la commande:
tail -f -n 0 file.txt
Mais il continue à se répéter.
Ce que je fais est le suivant:
Créez le fichier dans le premier terminal: touch file.txt
Commencez la queue dans le deuxième terminal: tail -f -n 0 file.txt
Editez le fichier dans le premier terminal: nano file.txt
Ajoutez simplement text
, enregistrez et fermez. La deuxième borne affiche text
comme il se doit.
Editez à nouveau le fichier dans le premier terminal: nano file.txt
Ajoutez à la fin (2ème ligne) more text
, enregistrez et fermez. Le deuxième terminal délivre:
tail: fichier.txt: fichier tronqué
texte
plus de texte
Editez à nouveau le fichier dans le premier terminal: nano file.txt
Ajoutez à la fin (3ème ligne) even more text
, sauvegardez et fermez. Le second terminal affiche even more text
comme il se doit.
Editez à nouveau le fichier dans le premier terminal: nano file.txt
Ajoutez à la fin (4ème ligne) and even more text
, sauvegardez et fermez. Le deuxième terminal délivre:
tail: file.txt: file truncated
text
more text
even more text
and even more text
J'ai besoin de la commande pour ne pas se répéter.
La sortie a abouti à:
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
Et j'en ai besoin pour sortir:
tail -f -n 0 file.txt
text
more text
even more text
and even more text
Ou, s'il n'est pas possible de supprimer le message "fichier tronqué", quelque chose comme:
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
Je ne sais pas non plus pourquoi cela donne un message tronqué au fichier. Je commence à insérer le nouveau texte à la fin du fichier.
D'abord, vous obtenez l'erreur parce que vous utilisez un éditeur de texte pour cela. Cela signifie que chaque fois que vous ouvrez, modifiez et enregistrez le fichier, l’original est remplacé par le nouveau contenu. Que vous ayez ajouté une seule ligne à la fin ou 100 lignes partout est sans importance, le fait est que le fichier est en train d'être ouvert, modifié et enregistré et que le contenu est écrasé.
Par exemple, comparez votre flux de travail pour exécuter ceci:
for((i=0;i<20;i++)); do echo $i >> file.txt; sleep 1; done
Cela écrira un numéro dans file.txt
toutes les secondes pendant vingt secondes. Si vous ouvrez un autre terminal et exécutez tail -fn 0 file.txt
, vous verrez le résultat attendu.
Donc, pour obtenir le comportement souhaité, ajoutez le texte au fichier en utilisant >>
depuis un terminal au lieu de le modifier manuellement.
nano
semble être l'intrus ici. La plupart des éditeurs lors de l'ouverture d'un fichier puis de son enregistrement suppriment le fichier d'origine et en enregistrent un nouveau du même nom. Vous pouvez le tester en vérifiant le numéro d'inode du fichier:
$ ls -il file.txt
16647801 -rw-r--r-- 1 terdon terdon 9 Apr 6 18:19 file.txt
Les fichiers sont simplement des liens durs vers des inodes spécifiques. Dans ce cas, file.txt
pointe sur inode 16647801
. Maintenant, ouvrez le fichier dans gedit
, ajoutez une ligne et vérifiez à nouveau l'inode:
$ gedit file.txt
$ ls -il file.txt
16647854 -rw-r--r-- 1 terdon terdon 13 Apr 6 18:23 file.txt
Comme vous le voyez, le numéro d'inode a changé. En d'autres termes, le fichier d'origine a été supprimé et un nouveau créé. nano
ne fait pas cela, essayer la même chose avec nano
ne modifie pas l'inode. Cependant, il supprime le contenu d'origine en le remplaçant par le nouveau. C’est pourquoi tail
affiche le résultat. Si vous l’essayez et modifiez le fichier avec gedit
(ou emacs
ou plusieurs autres éditeurs), les lignes supplémentaires que vous ajoutez ne seront pas indiqué dans la sortie de tail
du tout.
Comme indiqué dans l'une des autres réponses, cela se produit car votre fichier est écrasé chaque fois que vous enregistrez le fichier. La commande tail a été conçue pour surveiller les fichiers journaux dans lesquels de nouvelles lignes sont ajoutées au fichier.
Dans cette situation particulière, j'utiliserais les solutions suivantes comme solution de contournement:
watch -n 1 cat file.txt
La commande watch exécute une commande périodiquement. L'intervalle de mise à jour, en secondes, est spécifié avec -n
et peut être ajusté à votre guise.