私は次のコマンドを使用しています:
tail -f -n 0 file.txt
しかし、それは繰り返されます。
私がやっていることは次のとおりです:
最初のターミナルでファイルを作成します:touch file.txt
2番目のターミナルでテールを開始します:tail -f -n 0 file.txt
最初のターミナルでファイルを編集します:nano file.txt
text
を追加して、保存して閉じます。 2番目の端末は、text
を出力するはずです。
最初のターミナルでファイルを再度編集します:nano file.txt
最後に追加(2行目)more text
、保存して閉じます。 2番目の端末の出力:
tail:file.txt:切り捨てられたファイル
テキスト
詳細テキスト
最初のターミナルでファイルを再度編集します:nano file.txt
最後に追加(3行目)even more text
、保存して閉じます。 2番目の端末はeven more text
を出力するはずです。
最初のターミナルでファイルを再度編集します:nano file.txt
最後に追加(4行目)and even more text
、保存して閉じます。 2番目の端末の出力:
tail: file.txt: file truncated
text
more text
even more text
and even more text
繰り返さないためにコマンドが必要です。
出力の結果:
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
そして、私はそれを出力する必要があります:
tail -f -n 0 file.txt
text
more text
even more text
and even more text
または、「ファイルの切り捨て」メッセージを削除できない場合は、次のようになります。
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
また、ファイルが切り捨てられたメッセージを表示する理由もわかりません。ファイルの最後に新しいテキストの挿入を開始します。
まず、テキストエディターを使用しているため、エラーが発生します。これは、ファイルを開いて編集して保存するたびに、元の内容が新しい内容で上書きされることを意味します。末尾に1行を追加するか、場所全体に100行を追加するかは関係ありません。ポイントは、ファイルが開かれ、編集および保存され、コンテンツが上書きされることです。
たとえば、ワークフローとこれを実行することを比較します。
for((i=0;i<20;i++)); do echo $i >> file.txt; sleep 1; done
それは20秒の間、毎秒file.txt
に数字を書き込みます。別のターミナルを開いてtail -fn 0 file.txt
を実行すると、期待する出力が表示されます。
したがって、目的の動作を得るには、手動で編集する代わりに、ターミナルから>>
を使用してテキストをファイルに追加します。
nano
はここでは奇妙なもののようです。ほとんどのエディターは、ファイルを開いて保存すると、実際には元のファイルを削除し、同じ名前で新しいファイルを保存します。これをテストするには、ファイルの inode番号 を確認します。
$ ls -il file.txt
16647801 -rw-r--r-- 1 terdon terdon 9 Apr 6 18:19 file.txt
ファイルは特定のiノードへの単なるハードリンクです。この場合、file.txt
はiノード16647801
を指します。ここで、gedit
でファイルを開き、行を追加して、iノードを再度確認します。
$ gedit file.txt
$ ls -il file.txt
16647854 -rw-r--r-- 1 terdon terdon 13 Apr 6 18:23 file.txt
ご覧のとおり、inode番号が変更されています。つまり、元のファイルが削除され、新しいファイルが作成されました。 nano
はそれを行いません。nano
で同じことを試みても、iノードは変更されません。ただし、元のコンテンツを削除して、新しいコンテンツで上書きします。 tail
が実際に出力を表示するのはそのためです。それを試してgedit
(またはemacs
または他の多くのエディター)でファイルを編集すると、追加する余分な行はtail
の出力に表示されます。
すでに他の回答のいずれかで述べたように、ファイルを保存するたびにファイルが上書きされるため、これが起こっています。 tailコマンドは、ファイルに新しい行が追加されるログファイルを監視するために設計されました。
この特定の状況では、次を回避策として使用します。
watch -n 1 cat file.txt
Watchコマンドは、定期的にコマンドを実行します。更新間隔(秒単位)は-n
で指定され、お好みに合わせて調整できます。