Você precisaria registrar o deslocamento no final.
Seria mais fácil com o ksh93 ou o zsh que construíram operadores para isso em vez de bash.
Por exemplo, com ksh93:
#! /bin/ksh93
file=/some/file.log
offset_file=$file.offset
offset=$(<"$offset_file")
{
do-your-processing; ret=$?
echo "$(<#((CUR)))" > "$offset_file" && exit "$ret"
} < "$file" <#((offset))
com zsh
:
#! /bin/zsh
zmodload zsh/system
file=/some/file.log
offset_file=$file.offset
offset=$(<$offset_file)
{
sysseek offset || exit
do-your-processing; ret=$?
echo $((systell(0))) > $offset_file && exit $ret
} < $file
Com bash
, você poderia fazer a maioria das opções acima e ligar para ksh93
, zsh
ou perl
para fazer a pesquisa / declaração:
#! /bin/bash
file=/some/file.log
offset_file=$file.offset
offset=$(<"$offset_file")
seek() {
OFFSET=$1 perl -e '
seek(STDIN, $ENV{OFFSET}, 0) || die "seek: $!\n"'
}
tell() {
perl -le 'print tell(STDIN)'
}
{
seek "${offset:-0}" || exit
do-your-processing; ret=$?
tell > "$offset_file" && exit "$ret"
} < "$file"
Você deseja ter certeza de que sempre que o arquivo for truncado, o arquivo fileoffset será vazio, truncado ou será escrito 0.