我有一個相當奇怪的問題。我無法弄清楚它爲什麼會發生或如何解決它。命令在讀取時不輸出?
的腳本:
#!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命令的用戶的交互(例如按鍵,屏幕抽頭等),並輸出一個腳本到標準輸出,可用於複製這些事件。
附加信息:
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
問題:
代碼運行作爲經驗當「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 _
運行這個單獨輸出顯示到標準輸出(輸出的應該被讀取和修改while循環中):
timeout -t 5 getevent -t
有什麼想法?
謝謝。
編輯:
好了,所以我認爲這是一個緩衝的問題。基本上,這給出了類似的問題: getevent > output
文件獲取每一堆事件的更新,但不是立即(如果沒有足夠的事件,可能永遠不會更新)。我沒有意識到Android上的任何工作。
SO的主題。試試XDA Devs – Simon 2013-02-20 22:43:21
@Simon這是一個脫離話題嗎?它可能使用android特定的命令,但這是一個編程問題,考慮到我遇到的問題。 – GermainZ 2013-02-20 22:47:17
對不起,我無法幫助這個特殊的shell arcana,但是對於框架良好的問題+1顯示出相當大的工作量。繼續發帖。祝你好運! – shellter 2013-02-21 01:51:21