web-dev-qa-db-ja.com

「tail」コマンドの「-f」パラメーターはどのように機能しますか?

$ tail -f testfile

コマンドは、指定されたファイルの最新のエントリをリアルタイムで表示することになっていますか?しかし、それは起こっていません。私がやろうとしていることが間違っている場合は、私を訂正してください...

新しいファイル「aaa」を作成し、テキスト行を追加して閉じました。次に、次のコマンドを発行します(1行目):

$ tail -f aaa
xxx
xxa
axx

最後の3行はファイルaaaの内容です。コマンドがまだ実行されているので(-f)、GUIを介してファイルaaaを開き、数行を手動で追加し始めました。しかし、ターミナルはファイルに追加された新しい行を表示しません。

ここで何が問題になっていますか? tail -fコマンドは、システムによってのみ書き込まれた場合にのみ新しいエントリを表示しますか? (ログファイルなど)

62
its_me

tail(1)から man page

   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.

テキストエディタが元のファイルの名前を変更または削除して、新しいファイルを同じファイル名で保存しています。使用する -F代わりに。

エディタには、ファイル用の独自のバッファがあります。エディターでテキストを変更しても、ファイル自体には何も書き込まれません。

変更を保存すると、エディターが古いファイルを削除して新しいファイルを作成する可能性があります。 tail -fは削除されたファイルに接続されたままなので、新しいものは表示されません。

11

tailデフォルトでは、1秒ごとに「更新」します。リアルタイムではありません。

これで試してください(bash4が必要です):

  • 2つの端子を開きます。
  • 最初のターミナルでtouch ~/output.txttail -f ~/output.txtを実行します。
  • 2番目のターミナルでfor i in {0..100}; do sleep 2; echo $i >> ~/output.txt ; doneを実行します
  • 最初のターミナルでテールの出力を見てください。
4
Rufo El Magufo