Em um trabalho anterior, eu não conseguia encontrar um observador confiável apenas com command-fu, então eu tinha um script de wrapper como o abaixo, que inspecionava o arquivo a cada segundo de poll_duration e preenchia as novas linhas da frase interessada.
#!/bin/bash
file=$1
phrase=$2
poll_duration=$3
typeset -i checked_linecount
typeset -i new_linecount
typeset -i new_lines
let checked_linecount=new_linecount=new_lines=0
echo "Watching file $file for phrase \"$phrase\" every $poll_duration seconds"
while [ 1 ]
do
let new_linecount=`wc -l $file| awk '{print $1}'`
if [[ $new_linecount > $checked_linecount ]]; then
let "new_lines = $new_linecount-$checked_linecount"
head --lines=$new_linecount "$file" | tail --lines=$new_lines | grep "$phrase" && beep
let checked_linecount=$new_linecount
fi
sleep $poll_duration
done
Isso foi em uma máquina Unix. No Linux, você pode melhorar ainda mais usando sua interface inotify filewatcher. Se este pacote ( inotify-tools no Ubuntu) estiver presente, substitua
sleep $poll_duration
com
inotifywait -e modify "$file" 1>/dev/null 2>&1
Essa chamada é bloqueada até que o arquivo seja modificado. A versão de bloqueio é quase tão eficiente quanto a que você obteria com a tail -f
versão se o pipe pudesse ser configurado para funcionar sem buffer.
Nota: O script primeiro faz um head --lines=$new_linecount
para garantir que as linhas adicionadas ao arquivo após a verificação não distorcem a parte do arquivo que é verificado nesse loop.