命令在完成

时间:2017-07-26 14:24:05

标签: bash shell adb

我有这个脚本:

#!/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负责崩溃脚本。

知道为什么会这样吗?

1 个答案:

答案 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

当然,这要求您的脚本使用当前未使用的文件描述符,因此有点脆弱。