#!/bin/sh

read_timeout () {
    saved_traps="$(trap)"
    trap 'printf "timed out\n"; eval "${saved_traps}"; return' TERM
    { sleep $1; kill -TERM $$; } >/dev/null 2>&1 &
    timer_pid=$!
    read $2
    kill $timer_pid 2>/dev/null
    eval "${saved_traps}"
}

# example
read_timeout 1 value
printf "read \"%s\"\n" "${value:=default}"
