I don't know if you have this available, but `timeout` is a common utility program: https://manpages.ubuntu.com/manpages/cosmic/en/man1/timeout.1.html (It's GNU) So you could start the whole grep pipeline with that command in a new shell, or if you wanted you could do a callback to a parent ZSH process like the zsh-async does with SIGWINCH, catch that and kill a job. (You could enable job control then kill %0 or similar when you get the interrupting signal back.) On Wed, Feb 13, 2019 at 7:01 PM Dominik Vogt wrote: > Hi Folks, > > I'm really stuck with this problem. We need a fast, and reliable > way to send a string to a serial device and grep for a certain > reply, and failed to make that work with "expect" - because its > documentation is awful. Anyway, it should be not too difficult to > do with zsh. The task is: > > 1. configure serial line, e.g. with > > $ stty -F /dev/ttyUSB0 speed 115200 cs8 -cstopb -parenb -echo > > 2. Send some string to the serial line > > $ echo foo > /dev/ttyUSB0 > > 3. Grep for a certain reply with configurable, sub second timeout. > > $ ?????? > > 4. In case of a timeout, all input from the serial line is stored > in a file or shell variable. > > There should be no noticeable delay if the expected reply shows > up immediately. > > Something like this should do it: > > -- snip -- > #!/usr/bin/zsh > > set -u > set -C > > SEND="$1" > EXPECT="$2" > TIMEOUT="$3" > DEV="$4" > LOGFILE="$5" > shift 5 > > trap "exit 1" TERM > > # serial setup > stty -F "$DEV" speed 115200 cs8 -cstopb -parenb -echo > /dev/null > # watchdog process > { sleep "$TIMEOUT"; echo "timeout" 1>&2; kill 0 2> /dev/null; } & > # child sends string with delay > { sleep 0.01; echo "$SEND" > "$DEV" } & > rm -f "$LOGFILE" > # parent waits for reply > tee "$LOGFILE" < "$DEV" | > while read LINE; do > if { cat < $LINE > EOF > } | grep -q "$EXPECT" > then > trap : TERM > kill 0 2> /dev/null > exit 0 > fi > done > exit 1 > -- snip -- > > But this looks really complicated and the "sleep 0.01" is > annoying. There must be an easier way. > > Also, I'm not convinced that "tee" won't buffer serial input and > cause a timeout, although on the test machine it doesn't. > > Ciao > > Dominik ^_^ ^_^ > > -- > > Dominik Vogt > -- *\Ben Klein* Founder and Owner of Robosane, robobenklein@robosane.net You can find me elsewhere online as 'robobenklein'. If you need to contact me securely, I am also reachable via GPG, or on Keybase.