【发布时间】:2013-02-20 22:31:42
【问题描述】:
我有一个很奇怪的问题。我不知道为什么会发生这种情况或如何解决它。
脚本:
#!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 "$*"
"$@" | 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 循环的第一行甚至没有运行。
使用 set -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 上有任何解决方法。
【问题讨论】:
-
离题了。试试 XDA 开发人员
-
@Simon 这怎么跑题了?考虑到我遇到的问题,它可能会使用 android 特定的命令,但这是一个编程问题。
-
对不起,我对这个特殊的 shell 奥秘无能为力,但 +1 表示精心设计的问题,显示了相当多的工作。继续发帖。祝你好运!
-
@shellter ormaaj 重写了我的第一个脚本(后来我不得不修改他的版本,因为我的 shell 明显有问题),所以脚本的功劳应该给他 :)
标签: android bash shell sh busybox