Директива оболочки >>
открывает существующий файл, в то время как vim
создает новый файл с тем же именем, что и старое, в результате чего ваша программа читает теперь анонимный файл.
$ touch a
$ perl -MFile::stat -e'my $qfn = $ARGV[0]; my $s = stat($qfn) or die $!; printf "%s:%s\n", $s->dev, $s->ino' a
2065:1084527165
$ cat >>a
foo
$ perl -MFile::stat -e'my $qfn = $ARGV[0]; my $s = stat($qfn) or die $!; printf "%s:%s\n", $s->dev, $s->ino' a
2065:1084527165
$ vim a
$ perl -MFile::stat -e'my $qfn = $ARGV[0]; my $s = stat($qfn) or die $!; printf "%s:%s\n", $s->dev, $s->ino' a
2065:1084520254
Вам необходимо заново открыть файл.
#!/usr/bin/perl
use strict;
use warnings;
use AnyEvent;
use Fcntl qw( SEEK_SET );
my $cv = AE::cv;
my $qfn = $ARGV[0];
my $last_pos = 0;
my $timer = AE::timer 0, 10, sub {
open(my $fh, '<', $qfn)
or die("Can't open file: $!\n");
seek($fh, $last_pos, SEEK_SET)
or die("Can't seek: $!\n");
printf "TELL: %s EOF: %s\n", tell $fh, eof $fh;
print while <$fh>;
( $last_pos = tell($fh) ) >= 0
or die("Can't tell: $!\n");
};
$cv->recv;
Выходы:
$ echo foo >a
$ perl a.pl a
TELL: 0 EOF:
foo
TELL: 4 EOF: 1
TELL: 4 EOF: 1 echo bar >>foo
TELL: 4 EOF:
bar
TELL: 8 EOF: 1
TELL: 8 EOF: 1 Used vim to change the file to "The quick brown fox"
TELL: 8 EOF:
k brown fox
TELL: 20 EOF: 1
^C