Results from dns-sd are not necessarily being delivered instantly and there might be no lines which contain this flag to check of it's the last entry. It's also rather ugly to create a named pipe for this purpose, don't you think?
Again, untested:
#! /bin/sh
timeout=5
fifo=/tmp/discover-vnc.fifo
rm -f $fifo
mkfifo $fifo
dns-sd -B _rfb._tcp >$fifo &
pid1=$!
while read line; do
case $line in *_rfb._tcp.*)
# do something here.. then test
# if flag=3 and break otherwise
esac
done <$fifo &
pid2=$!
sleep $timeout && kill $pid1 $pid2 &
pid3=$!
wait $pid2
kill $pid3
It's also rather ugly to create a named pipe for this purposeBecause it creates a file in /tmp? Who cares? The alternative is bash voodoo magic.. the same magic that gave us shellshock.
I love this one.