I'm using the following statement (simplified version):
tail -f -c+1 <filename>
in order to pipe a file to a process.
What I've found, though, is that there is a number of lines at the end which are not piped.
A specific example is piping a mysql file, and stopping when the end is reached:
tail -f -c+1 mysqdump.sql | sed '/^-- Dump completed/ q0'
This doesn't work - the last line of the dump -- Dump completed [...]
is not piped to sed.
My guess is that the tail -f
buffer, in this case, is flushed only when it's full.
Does anybody know how can I workaround this?
=================
I've found the cause - the description is not complete (and the code doesn't exhibit the behavior).
The problem happens when piping from a compressed (lzma) file:
tail -f -c+1 <filename.lzma> | lzma -d | sed '/^-- Dump completed/ q0'
Most likely, tail
is not sending the last compressed block, because it doesn't detect any new line, as the input is binary.