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.