少しテキストが表示されるまでファイルを見たい
私はこの答えを見つけました: `tail -f`テキストが表示されるまで
しかし、私がubuntuでそれを試したとき、それは終了しません:
$ echo one > test.txt
$ echo two >> test.txt
$ echo three >> test.txt
$ echo four >> test.txt
$ cat test.txt | sed '/w/ q'
one
two
$
期待どおりに動作します。ただし、ファイルをテールしようとすると
$ tail -f test.txt | sed '/w/ q'
one
two
それは決して存在しません。パイプが壊れてもテールが止まらない。
tail
が終了したときにsed
を終了させる方法を知っている人はいますか?
それはと同じものです:
に:
_cmd1 | cmd2
_
シェルは、_cmd1
_がすでに終了した後でも、_cmd2
_が終了するまで待ちます。これはすべてのシェルに当てはまるわけではありません。たとえば、ボーンやコーンシェルのようなものはそうではありません。
_cmd2
_が終了すると、_cmd1
_のstdoutのパイプはbrokenになりますが、これは_cmd1
_を即座に終了しません。
_cmd1
_は、次にそのパイプに書き込もうとしたときに終了します。次に、デフォルトのアクションがプロセスの終了であるSIGPIPEを受け取ります。
_cmd1
_ == _tail -f file
_および_cmd2
_ == _sed /w/q
_を使用すると、_tail -f
_はファイルの最後の10行を読み取り、それらをstdout(パイプ)に書き込みます、通常、行が本当に大きく、file
に追加されるテキストが追加されるのを待ってそこに座っている場合を除き、1つのチャンクになります。
同時に実行されるsed
は、stdinでの入力を待機し、それを読み取り、1行ずつ処理し、w
を含む行がある場合は終了します。
その行が見つかるとすぐに(またはsed
の実装により1行の遅延が発生する可能性があります)、その行は終了しますが、その時点でtail
はすでにすべてのパイプに書き込みを行っていますWRITEに変換するため、後でファイルに追加のテキストが追加されない限り、SIGPIPEを受信しません(その時点で、致命的なwrite()
が実行されます)。
_cmd1
_が終了するとすぐに_cmd2
_を終了させたい場合は、_cmd2
_が終了したら何かを強制終了する必要があります。同様に:
_sh -c 'echo "$$"; exec tail -f test.txt' | {
IFS= read pid
sed /w/q
kill -s PIPE "$pid"
}
_
またはbash
を使用:
_{ sed /w/q; kill -s PIPE "$!"; } < <(exec tail -f text.txt)
_