当前位置: 首页 > 知识库问答 >
问题:

命令在bash脚本完成[duplicate]之前停止它

年文柏
2023-03-14

我有这个脚本:

#!/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外壳“am instrument -w -r -e 调试假 -e 类 fr.inria.es.电子智能.活动.测试协议 fr.inria.es.电子智能.调试.测试/android.support.test.runner.AndroidJUnitRunner” ||真实是导致脚本崩溃的原因。

知道为什么会这样吗?

共有1个答案

卫华奥
2023-03-14

如果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

另一个常见的习惯用法是从不同的文件描述符中< code>read,或者从< code>/dev/null或< code>/dev/tty中重定向输入,而不是关闭输入。而且,如果您所在的系统没有< code>/dev/tty,但是希望从原始脚本的stdin中读取内部循环,您可以:

exec 3<&0
adb devices | while read device label _; do
   ...
   fi <&3
done

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

 类似资料:
  • 问题内容: 我有一个python脚本,该脚本在运行时会在终端上记录信息,我想将此记录信息发送到文本文件, 为了实现这一点,我正在插入文件 在文件末尾,我放入 问题是当它调用第一个命令时,它将终止脚本, 提前感谢我如何做这项工作的任何建议 问题答案: 问题在于,直到退出产生的外壳程序才返回,这时您的Python脚本将恢复。 执行所需操作的最简单方法是使用Python脚本作为参数来调用自身。代替 您将

  • 您的Google Maps代码结构如下所示: 回调? JavaScriptpromise? 您能想到的其他方法吗? 同样,这里所建议的信号量是一种可行的方法吗?

  • 我已经写了一个脚本,在我的Ubuntu发行版上作为自动点击器工作。点击工作,但'sleep‘命令似乎不能正常工作。如果我取出click并从terminal运行它,那么sleeps将按预期工作。但是当我将它绑定到一个快捷方式并且在玩游戏的时候运行它的时候,它并没有Hibernate,看起来它只是一直点击。 最重要的Hibernate是break_intervalHibernate,因为它将高压灭菌器

  • 问题内容: 我正在尝试使用bash脚本将JSON文件上传到我的noSQL数据库中,但是它不起作用,我也不明白为什么。 这是脚本: 这是错误: 当我执行命令行中给出的命令时,它仍然可以正常工作。 这是什么错误?谢谢 问题答案: 不要将命令存储在变量中;如果您绝对必须具有可用于日志记录的内容,请将 参数 放入数组中。

  • 问题内容: 我正在尝试使用命令记录bash会话。 该命令是从bash脚本开始执行的,但是一旦执行,bash脚本就会终止。 我尝试使用各种组合来始终以相同的结果调用命令(调用该命令后立即终止bash脚本)。我得到的输出如下: 我也尝试过最后用a来调用命令,但是再次失败了。 谁能告诉我如何从bash脚本调用命令? 谢谢 问题答案: 您的Shell脚本没有终止。它仍在运行。您会收到提示,因为正在生成新的

  • 问题内容: 我有一系列要执行的命令。但是,只要出现“找不到命令”错误,我就需要退出。因此,执行输出后检查不是一种选择 “ $?” 当“未找到命令”并成功时,变量等于零。 问题答案: 如果应该通过脚本完成此操作,则很自然地可以使用条件来表达这种行为: