У меня довольно странная проблема. Я не могу понять, почему это происходит или как это исправить.Команда не дает выхода при чтении?
Сценарий:
#!system/bin/sh
#set -x
reader() {
t2=-1
grep -v -E "add device|name:" | while IFS=' ' read -r t1 a b c d _; do
t1=${t1%%-*}
t=`expr $t1 - $t2`
if let 't > 0 && t2 > -1'; then
echo "sleep $t"
fi
printf 'sendevent %s' "${a%?}"
printf '%5d %5d %5d\n' "0x$b" "0x$c" "0x$d"
t2=$t1
done
}
let() {
IFS=, command eval [ '$(($*))' -ne 0 ]
}
countDown() {
echo 'Starting in...'
i=4
while [[ $i -gt 1 ]]; do
i=$(($i-1))
echo "$i"
sleep 1
done
printf '%s\n\n\n' 'Go!'
# echo "$*"
"[email protected]" | reader
}
clear
printf '%s >' 'Catch by [n]umber of events or [t]imeout?'
read type
case $type in
n)
printf '%s >' 'Events to catch?'
read arg
echo "Gonna catch $arg events!"
countDown getevent -t -c "$arg"
;;
t)
printf '%s >' 'Timeout (in seconds)?'
read arg
echo "Gonna catch events for $arg seconds!"
countDown timeout -t $arg getevent -t
esac
Цель сценария:
Поймайте взаимодействия пользователя (например, нажатие клавиши, экран краны и т.д.) с помощью команды GetEvent и выводит скрипт на stdout, который может использоваться для репликации этих событий.
Дополнительная информация: выход
GetEvent находится в шестнадцатеричном формате SendEvent принимает десятичный формат
Ожидаемый выход:
Catch by [n]umber or by [t]imeout? n
Events to catch? > 4
Gonna catch 4 events...
Starting in...
3
2
1
Go!
sendevent /dev/input/event5 1 102 1
sendevent /dev/input/event5 0 0 0
sleep 3
sendevent /dev/input/event5 1 102 0
sendevent /dev/input/event5 0 0 0
Проблема:
Трассы код как expe cted, когда выбрано «n». Когда выбрано «t», сценарий завершается через указанное количество секунд. Однако он ничего не выводит - первая строка цикла while даже не запускается.
с множеством -x, вот то, что показано (последние несколько строк):
+ printf %s\n\n\n Go!
Go!
+ reader
+ t2=-1
+ grep -v -E add device|name:
+ timeout -t 5 getevent -t
+ IFS = read -r t1 a b c d _
Running это само по себе показывает вывод на стандартный вывод (вывод, который должен быть считан и изменен внутри цикла While):
timeout -t 5 getevent -t
Любые идеи?
Спасибо.
EDIT:
Хорошо, так что я думаю, что это проблема с буферизацией. В основном это дает аналогичную проблему: getevent > output
Файл обновляется каждый куча событий, но не мгновенно (и, возможно, никогда не обновится, если не будет сделано достаточно событий). Я не знаю, как работать на Android.
Отключить тему для SO. Попробуйте XDA Devs – Simon
@Simon Как это не в тему? Он может использовать специальные команды для Android, но это вопрос программирования, учитывая проблему, с которой я сталкиваюсь. – GermainZ
Извините, я не могу помочь в этом конкретном битке arcana, но +1 для хорошо оформленного вопроса, показывающего значительную работу. Продолжайте публикацию. Удачи! – shellter