我有这个脚本:
#!/usr/bin/bash
uninstall ()
{
echo "$device : uninstalling the app..."
adb -s $device uninstall "fr.inria.es.electrosmart.debug"
}
install_app ()
{
echo "$device : installing the app..."
adb -s $device install -r /run/netsop/u/sop-nas2a/vol/home_diana/nagarwal/StudioProjects/es-android/app/build/outputs/apk/app-debug.apk
}
install_tests ()
{
echo "$device : installing the tests..."
adb -s $device install -r /run/netsop/u/sop-nas2a/vol/home_diana/nagarwal/StudioProjects/es-android/app/build/outputs/apk/app-debug-androidTest.apk
}
run_tests ()
{
echo "$device : running the tests..."
adb -s $device shell "am instrument -w -r -e debug false -e class fr.inria.es.electrosmart.activities.TestAgreement fr.inria.es.electrosmart.debug.test/android.support.test.runner.AndroidJUnitRunner" || true
}
adb devices | while read line
do
if [ ! "$line" = "" ] && [ `echo $line | awk '{print $2}'` = "device" ]
then
device=`echo $line | awk '{print $1}'`
echo "$device $@ ..."
uninstall
install_app
install_tests
run_tests
fi
done
它应该在所有连接的设备上运行测试。我有两台设备连接到我的电脑。但是测试只在第一台设备上运行,脚本在第二台设备上运行之前就停止了。
我认为命令adb -s $device shell "am instrument -w -r -e debug false -e class fr.inria.es.electrosmart.activities.TestAgreement fr.inria.es.electrosmart.debug.test/android.support.test.runner.AndroidJUnitRunner" || true
负责崩溃脚本。
知道为什么会这样吗?
答案 0 :(得分:0)
如果abd
正从stdin读取,则它正在消耗您的while循环读取的数据。为了避免这种情况,尝试关闭循环体的stdin,这样就没有东西可以吃掉数据了:
adb devices | while read device label _; do
if test "$label" = device; then
echo "$device $@ ..."
uninstall
install_app
install_tests
run_tests
fi <&-
done
另一个常见习语是来自不同文件描述符的read
,或来自/dev/null
或/dev/tty
的重定向输入,而不是关闭输入。而且,如果您所在的系统没有/dev/tty
但希望从原始脚本的stdin中读取内部循环,则可以执行以下操作:
exec 3<&0
adb devices | while read device label _; do
...
fi <&3
done
当然,这要求您的脚本使用当前未使用的文件描述符,因此有点脆弱。