Se você puder usar o Bash, poderá usar a opção -t
(tempo limite) para read
e / ou a variável SECONDS
.
Isso é um pouco feio, mas funciona para agrupar as entradas que chegam aproximadamente dentro de um segundo:
#!/bin/bash
while true; do
values=()
start=$SECONDS
while [ "$SECONDS" -lt $((start + 1)) ]; do
if IFS= read -r -t 1 line; then
values+=("$line")
fi
done
if [ "${#values[@]}" != 0 ]; then
echo got "${values[@]}"
# do something useful with "${values[@]}" here
fi
done
O tempo limite em read
impede que o bloqueio permaneça para sempre, e o teste contra SECONDS
garante que o loop interno seja interrompido mesmo no caso patológico em que read
é inserido uma vez por segundo, para sempre.