sviluppo-web-qa.it

Come funziona il parametro "-f" del comando "tail"?

$ tail -f testfile

il comando dovrebbe mostrare le ultime voci nel file specificato, in tempo reale, giusto? Ma non sta succedendo. Per favore, correggimi, se quello che intendo fare è sbagliato ...

Ho creato un nuovo file "aaa", ho aggiunto una riga di testo e l'ho chiuso. quindi ha emesso questo comando (prima riga):

$ tail -f aaa
xxx
xxa
axx

le ultime tre righe sono i contenuti del file aaa. Ora che il comando è ancora in esecuzione (da quando ho usato -f), Ho aperto il file aaa tramite la GUI e ho iniziato ad aggiungere alcune altre righe manualmente. Ma il terminale non mostra le nuove linee aggiunte nel file.

Cosa c'è che non va qui? Il comando tail -f Mostra le nuove voci solo se sono scritte solo dal sistema? (come file di registro ecc.)

62
its_me

Dalla tail(1)pagina man :

   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.

L'editor di testo sta rinominando o eliminando il file originale e salvando il nuovo file con lo stesso nome file. Uso -F anziché.

66

Il tuo editor ha il suo buffer per il file. Quando modifichi il testo nell'editor, nulla viene scritto nel file stesso.

Quando salvi le modifiche, è probabile che l'editor elimini semplicemente il vecchio file e ne crei uno nuovo. tail -f sarà comunque collegato al file eliminato, quindi non mostrerà nulla di nuovo.

11

tail "aggiorna" ogni 1 secondo per impostazione predefinita, non in tempo reale.

Prova con questo (hai bisogno di bash4):

  • Apri 2 terminali.
  • Nel primo terminale eseguire touch ~/output.txt e tail -f ~/output.txt.
  • Nel secondo terminale eseguire for i in {0..100}; do sleep 2; echo $i >> ~/output.txt ; done
  • Guarda l'output di tail nel primo terminale.
4
Rufo El Magufo