[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.2 tail: ファイルの末尾部分を出力する

tail は、各 file の末尾部分 (デフォルトでは 10 行) を表示する。 ファイルが指定されていない場合や、file として ‘-’ が指定されている場合は、標準入力から読み込む。

書式:

 
tail [option]… [file]…

指定された file が 2 個以上あると、tail は、 各 file の出力の前に、以下のような 1 行からなるヘッダを出力する。

 
==> file name <==

tail の出力をさらに処理したい場合は、ファイルヘッダを行頭の見出しに変更すると便利かもしれない。 こんなふうにすればよい。

 
tail … |
awk '
  /^==> .* <==$/ {prefix=substr($0,5,length-8)":"; next}
  {print prefix$0}
' | …

GNU の tail は、出力するデータの量に制限がない (ほかの系統の tail には、制限があるものもある)。また、GNU の tail には、 ‘-r’ オプション (逆順で表示する) が存在しない。ファイルを逆順にするのは、 ファイルの末端部分を表示するのとは、全く別の仕事だからだ。BSD の tail には、‘-r’ があるが、バッファの大きさまでのファイルしか逆順にできず、 それは通常 32 KiB である。ファイルを逆順にするなら、GNU の tac コマンドの方が、信頼性という点でも、用途の広さという点でも優れている。

このプログラムでは以下のオプションが使用できる。参照: 共通オプション.

-c [+]num
--bytes=[+]num

ファイルの末尾数行を出力する代わりに、末尾の num バイトを出力する。 ただし、num の前に ‘+’ が付いている場合は、各ファイルの末端から num バイト目ではなく、先頭から num バイト目を始点として出力を開始する。 num は、整数であり、 以下に挙げるような何倍かを示す接尾辞を後ろに付けることもできる。接尾辞だけ指定してもよい (訳注: その場合は、1 が前にあるものと見なされる)。

 
b’  =>            512 ("blocks")
‘KB’ =>           1000 (KiloBytes)
‘K’  =>           1024 (KibiBytes)
‘MB’ =>      1000*1000 (MegaBytes)
‘M’  =>      1024*1024 (MebiBytes)
‘GB’ => 1000*1000*1000 (GigaBytes)
‘G’  => 1024*1024*1024 (GibiBytes)

T’, ‘P’, ‘E’, ‘Z’, ‘Y’ についても同様。

-f
--follow[=how]

ファイルの末端まで達しても、さらに文字を読み込もうとして、無限ループする。 たぶん、ファイルのサイズが増加し続けているからである。 複数のファイルが指定されている場合、tail は、 異なるファイルから出力があるたびに、その出力がどのファイルから来たものかわかるように、 ヘッダを表示する。

このオプションを使ってファイルの追跡をするとき、二つの方法が選択できるが、 その違いが現れるのは、追いかけているファイルが消去されたり、 名前を変更されたりしたときだけである。もし、増大しつつあるファイルが削除されたあとでも、 そのファイルの末尾の追跡を続行したいならば、‘--follow=descriptor’ を使用すればよい。これがデフォルトの動作だが、ログファイルを追跡している際には、 役に立たない。ログファイルは、ローテートされる (すなわち、消去、または名前を変更されてから、改めてオープンされる) 可能性があるからだ。そうした場合には、‘--follow=name’ を使用すれば、 指定した名前のファイルを追跡することができる。おそらく追跡には、 定期的にその名前のファイルをオープンし直すことで、 何らかのプログラムによってファイルが消去されてから再作成されなかったかどうかを確かめるといった方法が、 使われることだろう。なお、inotify をベースにした実装では、そうしたケースを処理するのに、 ファイルを定期的に再オープンする必要がないことを付記しておく。

どちらの方法を使った場合でも、追跡中のファイルのサイズが小さくなっていることがわかると、 tail は、ファイルが短縮されたというメッセージを出し、 ファイルの末端と改めて判断したところからファイルの追尾を再開する。

ファイルが消去されたときの tail の動作は、追いかけているものが、 名前か (‘--follow=name’)、ディスクリプタか (‘--follow=descriptor’) によって異なっている。名前による追跡の場合、 tail はファイルが消去されたことを検出できるので、その旨メッセージを表示する。 このとき、‘--retry’ も指定されていると、 同じ名前のファイルが再作成されているかどうか、定期的な検査を継続して行う。 ディスクリプタを追跡する場合は、ファイルが削除されたり、名前の変更が行われたりしても、 tail はそれを検出しないので、メッセージを出さない。そうしたファイルが、 もはや元の名前ではアクセスできなくなっていても、なお増大し続けているということもありえる。

descriptor’ や ‘name’ というオプションの値は、 長い方のオプションの形式によってのみ指定できる。‘-f’ では指定できない。

オペランド file が全く指定されていず、標準入力が FIFO やパイプである場合は、‘-f’ オプションは無視される。また、標準入力が FIFO やパイプである場合は、‘-’ という形で指定されたオペランドがあっても、 ‘-f’ はそれに対して効果を持たない。

カーネルが inotify をサポートしていると、出力はファイルの変更が引き金になるので、一般に反応がキビキビしている。 それに対して、カーネルが inotify をサポートしていないと、tail はチェックごとに 1 秒間スリープするので (このデフォルトを変更するには、‘--sleep-interval=n’ を使用する)、 出力がやや遅めに感じられたり、断続的に感じられたりするかもしれない。inotify のサポートなしで tail を使用する場合、反応を向上させるには、sleep する間隔を 1 秒以下に設定すればよい。たとえば、次のようなエイリアスを作成するわけだ。

 
alias tail='tail -s.1'
-F

このオプションは ‘--follow=name --retry’ と同じである。すなわち、 ファイルが消去された場合、tail はその名前のファイルをオープンし直そうとする。 それに失敗しても、ファイルに再びアクセスできるようになるまで、再オープンを試み続ける。

--max-unchanged-stats=n

名前によってファイルの追尾を行っているとき、連続して n 回 (デフォルトは n=5) 追尾動作を実行しても、その間にファイルに変更がなかった場合に、ファイルを open し、fstat して、 そのファイル名と結びついている「デバイス番号/inode 番号」の組み合わせが、 今でも前と同じままかどうかを確認する。ローテートを行うログファイルを追跡している場合、 この n は、tail がローテートする前に最後の行を表示してから、 新しいログファイルに溜まっている行を表示するまでの秒数に、ほぼ等しい。 このオプションに意味があるのは、ポーリングを使用して (すなわち、inotify を使わずに)、名前による追跡を行うときだけである。

-n [+]num
--lines=[+]num

末尾の num 行を出力する。ただし、num の前に ‘+’ が付いている場合は、各ファイルの末端から num 行目ではなく、 先頭から num 行目を始点として出力を開始する。サイズの乗数接尾辞は、‘-c’ の場合と同様である。

--pid=pid

追跡が名前によって行われていようと、ディスクリプタによって行われていようと、 file 引数で指定されたすべてのファイルに書き込みを行うプログラムがたった一つならば、 そのプログラムのプロセス番号 pid を指定することができる。 そうしておくと、そのプロセスが終了する直後に tail も終了するようになるのだ。 これがきちんと動作するのは、書き込みプログラムと tail のプロセスが、 同じマシンで動いているときだけである。たとえば、プログラムをビルドするとき、 その出力をファイルに保存しながら、ファイルが増大して行くのを見守りたいならば、 下記のように maketail を実行すればよい。 そうすれば、ビルドが完了したとき、tail のプロセスも終了する。 このオプションを使わない場合は、tail -f のプロセスを自分で止めなければならないだろう。

 
$ make >& makerr & tail --pid=$! -f makerr

使用されていない pid を指定した場合や、 tail が対象とするファイルに書き込んでいるプロセスとは別のプロセスの pid を指定した場合は、 tail は、file の増大が止まるずっと前に終了してしまうかもしれないし、 実際に書き込んでいるプログラムが終了してしまっても、当分の間終了しないかもしれない。 気をつけてほしいが、システムによっては、‘--pid’ が使えないことがある。 その場合、tail は警告メッセージを出すはずだ。

-q
--quiet
--silent

ファイル名を示すヘッダを出力しない。

--retry

指定された名前のファイルを繰り返し何度でもオープンしようとする。 このオプションが役に立つのは、ファイルの末尾を追跡している場合がほとんどである (それ以外の場合は、警告メッセージを出す)。

ファイル・ディスクリプタによって追跡している場合は (すなわち、 ‘--follow=descriptor’ の場合は)、 このオプションは、最初にファイルをオープンするときの動作にしか影響しない。 ひとたびオープンに成功してしまえば、tail は、ファイル名ではなく、 ファイル・ディスクリプタを追跡することになるからである。

ファイル名によって追跡している場合は (すなわち、‘--follow=name’ の場合は)、tail は、ユーザによって中断 (kill) されるまで、 いつまでも繰り返しその名前のファイルを再オープンしようとする。

このオプションを付けないと、 tail は、ファイルが存在しなくなったり、 何かほかの理由でファイルにアクセスできなくなったりすることがあっても、 その旨報告するだけで、以後再検査を行うことがない。

-s number
--sleep-interval=number

何秒間隔で追尾・表示動作を行うかを変更する (デフォルトは 1.0 秒間隔)。 tail は動作の繰り返しごとに、指定されたすべてのファイルについて、 サイズが変わっていないかどうかのチェックを行う。tail の伝統的な実装では、number は整数でなければならなかったが、GNU の tail では、任意の浮動小数点数を指定することが可能になっている。 See section 浮動小数点数. tail が inotify を使用していると、 このポーリング関係の (polling-related) オプションは通常無視される。 ただし、‘--pid=p’ も一緒に指定されている場合は別で、その場合は、 プロセス p が生きているかどうかを、tail が少なくとも number 間隔でチェックすることになる。

-v
--verbose

ファイル名を示すヘッダを常に出力する。

-z
--zero-terminated

項目の区切りに、改行 (ASCII LF) ではなく、ゼロバイトを使用する。 すなわち、入力を ASCII NUL で分離された項目として扱い、出力する各項目の末尾に ASCII NUL を付加する。このオプションは、‘perl -0’, ‘find -print0’, ‘xargs -0’ などと組み合わせて使用すると、 便利なことがある。そうしたコマンドでも、わがままなファイル名を (空白などの特殊文字を含んでいる場合でも) きちんと確実に処理するために、 同様なことをしているのである。

tail は互換性のために、‘tail -[num][bcl][f] [file]’ という古い用法もサポートしているが、それが認識されるのは、 上で説明した用法と衝突しないときだけである。この旧来の書式では、 オプションはただ 1 個しか指定できず、ファイルも 1 個までしか指定できない。 オプション中の num は、省略可能な 10 進数であり、サイズを表す文字 (‘b’, ‘c’, ‘l’) を後ろに続けて、1 ブロック当たり 512 バイトのブロック数か、バイト数か、行数かを示すことができる。 さらに、‘-f’ と同じ意味を持つ、‘f’ を続けてもよい。

POSIX 1003.1-2001 に準拠していないシステムでは、 旧来のオプション書式において、先頭の ‘-’ を ‘-c’ や ‘-n’ オプションの場合と同じ意味で ‘+’ に置き換えることができる。 また、POSIX 1003.1-2001 以前の旧式なシステムでは、 旧来の用法と標準的な用法が衝突する場合には、旧来の用法が優先される。 なお、そうした動作は、環境変数 _POSIX2_VERSION によってコントロールできる。 (see section 規格への準拠)。

標準的なホストで使用するためのスクリプトでは、旧来の書式を使わずに、 ‘-c num[b]’, ‘-n num’ オプションや ‘-f’ オプションの方を使うべきである。 そのスクリプトが、旧来の書式にしか対応していないホストでも動作しなければならない場合でも、 問題を起こしかねない表現を避けるように書き直すことが、たいていはできるものだ。 たとえば、‘tail -1’ の代わりに、‘sed -n '$p'’ を使うといった具合である。 それさえ不可能な場合は、どちらの書式を使うべきかを判断するために、 ‘if tail -c +1 </dev/null >/dev/null 2>&1; then …’ といった条件文をスクリプトで使用すればよい。

作成するスクリプトが標準的な動作を想定している場合でも、 POSIX のバージョンによって動作に違いのある用法には、気を付けた方がよい。 たとえば、‘tail - main.c’ は避けるべきである。‘tail main.c’ と解釈することも、‘tail -- - main.c’ と解釈することもできるからだ。 ‘tail -c 4’ も避けるべきである。‘tail -c4’ を意味するかもしれないし、 ‘tail -c 10 4’ を意味するかもしれない。‘tail +4’ も使わない方がよい。 ‘tail ./+4’ の意味にも、‘tail -n +4’ の意味にも取れるからである。

終了ステータス 0 は成功を示し、0 以外の値は失敗を示す。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

This document was generated on June 7, 2022 using texi2html 1.82.