Ниже оба переработанных варианта в рабочей обёртке.1) Можно ли как-то обойтись без kill в обоих вариантах? Если kill убрать, то зависнет. Висеть будет на строке возврата return, или - после её выполнения, но до выхода из блока. Кстати, тоже вопрос - где висит, как объяснить?
2) Не очевидно и тем неприятно, что до return убивается процесс источник потока. После | вызывается отдельный экземпляр shell, в котором и выполняется while. Возникает подозрение, о иерархии родитель-наследник, и тогда, что родитель (gpspipe) тушится до вызова возврата из наследника (блоки while). Всегда ли код возврата будет предсказуем?
3) В чём идея второго способа, относительного первого?
Вариант 1
#!/bin/bashcodeDataFound=11
codeTimeout=22
function probeGPS {
local timeout=1 # Sec
local maxStrQuantity=10
local N=0
gpspipe -r | while [ ${N} -le ${maxStrQuantity} ]; do
read -t 1 line
if [ ${?} -gt 128 ] ; then
echo "Timeout at: N=${N}; line=${line};"
#kill -9 $( pgrep -P ${$} gpspipe )
return ${codeTimeout}
fi
if [ "${line:1:5}" == "GPRMC" ] ; then
return ${codeDataFound}
fi
echo " S1=${S1}; N=${N}; line=${line:0:10};"
((N++))
done
return ${?}
}
probeGPS
case ${?} in
${codeDataFound})
echo "Data found."
;;
${codeTimeout})
echo "Timed out."
;;
esac
Вариант 2
#!/bin/bashcodeDataFound=11
codeTimeout=22
function probeGPS2 {
local N=0
local M=0
local maxQuantity=10
local timeout=1 # Sec
echo "Level 0"
gpspipe -r | while : ; do
echo "Level 1 : Q=$((N+M));"
while [ ${N} -le 10 ] && read -t ${timeout} line && [ ${?} -lt 128 ]; do
echo "Level 2 : Q=$((N+M)); line=${line:0:10};"
if [ "${line:1:5}" == "GPRMC" ] ; then
return ${codeDataFound}
fi
((M++))
done
((N++))
if [ $(( N+M )) -ge ${maxQuantity} ] ; then
kill -9 "$( pgrep -P ${$} gpspipe )"
return 22
fi
done
return ${?}
}
probeGPS2
case ${?} in
${codeDataFound})
echo "Data found."
;;
${codeTimeout})
echo "Timed out."
;;
esac