O tempo limite não ocorre quando se lê a partir do fifo usando 'read'

2

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.

    
por Majid Azimi 25.07.2012 / 11:08

2 respostas

0

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

    
por 28.07.2012 / 09:09
4

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
    
por 25.07.2012 / 11:19

Tags