Eu encontrei uma boa maneira de fazer isso:
exec 5<>/opt/data.log
while read -7 3 line <& 5; do
echo ${line}
done
Eu abro para ler e escrever para que o script não bloqueie para sempre. aqui está a descrição: link
Veja este código:
while read -t 3 line; do
echo ${line}
done < /opt/data.log
data.log
é um fifo. Um processo está escrevendo para isso, e esse código deve estar lendo para mostrar ao usuário. Mas eu quero que saia quando não houver mais dados no fifo por 3 segundos.
O problema é que nunca expira. Eu escrevo para este fifo, isso me mostra:
read: 6: Illegal option -t
O que está errado?
[UPDATE]
Sim, eu estava usando /bin/sh
como um shebang, que é um link simbólico para dash
. Eu mudei para /bin/bash
. mas isso não traz nenhum benefício. Espera para sempre se ninguém abrir o fifo. Eu quero uma solução de tempo limite que funcione quando o outro lado do fifo não tiver aberto.
Eu encontrei uma boa maneira de fazer isso:
exec 5<>/opt/data.log
while read -7 3 line <& 5; do
echo ${line}
done
Eu abro para ler e escrever para que o script não bloqueie para sempre. aqui está a descrição: link
você está usando o bash? ou algum outro sh? read -t
é um kshism (também suportado por bash e zsh mas não é padrão)
Funciona no bash, mas não no traço:
$ bash -c 'echo foo | while read -t 3 xxxx ; do echo $xxxx ; done' foo
$ dash -c 'echo foo | while read -t 3 xxxx ; do echo $xxxx ; done' dash: 1: read: Illegal option -t