Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 运行adb命令的Shell脚本会中断while循环_Android_Bash_Shell_Adb - Fatal编程技术网

Android 运行adb命令的Shell脚本会中断while循环

Android 运行adb命令的Shell脚本会中断while循环,android,bash,shell,adb,Android,Bash,Shell,Adb,我正在编写一个bin bash shell脚本,以便一次从多个设备收集信息。然而,我注意到,如果在while循环中执行任何adb命令,就会中断它。不知道为什么,因为循环显然不完整。我知道有多个feed在讨论这个话题,但我找不到类似的问题。任何建议都会有帮助。多谢各位 #!/bin/bash echo "# Collecting attached devices under adb and record the project name..." adb devices | while read l

我正在编写一个bin bash shell脚本,以便一次从多个设备收集信息。然而,我注意到,如果在while循环中执行任何adb命令,就会中断它。不知道为什么,因为循环显然不完整。我知道有多个feed在讨论这个话题,但我找不到类似的问题。任何建议都会有帮助。多谢各位

#!/bin/bash
echo "# Collecting attached devices under adb and record the project name..."
adb devices | while read line
do

   if  [ "$line" != "" ] && [ `echo $line | awk '{print $2}'` = "device" ]
then

device_sn=`echo $line | awk '{print $1}'`

project_name=`adb -s $device_sn shell getprop ro.product.device` #This line will break the while loop. If I remove it I can have all connected devices reboot to bootloader

echo "$project_name: $device_sn is rebooting to bootloader"

adb -s $device_sn reboot bootloader

   fi
done

我在这里猜测,但可能是
adb
命令在读取
时正在读取用于
的输入。这是
while read
类型循环的一个相当常见的问题,您描述的症状与之匹配。一种可能是重定向内部命令上的输入,使其无法从意外源读取,如下所示:

project_name=`adb -s $device_sn shell getprop ro.product.device` </dev/null
while read line <&3
do
    # normal loop contents here...
done 3< <(adb devices)
这些重定向将输入传递到文件描述符#3上(0是标准输入,#1是标准输出,#2是标准错误,#3通常未使用)。使用此表单,您不必知道循环中的哪些命令可能会从标准输入读取,因此没有什么意外(如果它们确实需要从终端读取,那么它们可以!)。此外,与标准管道不同,它在主shell进程中运行循环,而不是在子shell中运行,从而避免了一些奇怪的情况(例如循环中设置的变量在循环之后不可用)


尽管有一个缺点:进程替换,
我猜在这里,但可能是
adb
命令在读取时读取了用于
的输入。这是
while read
类型循环的一个相当常见的问题,您描述的症状与之匹配。一种可能是重定向内部命令上的输入,使其无法从意外源读取,如下所示:

project_name=`adb -s $device_sn shell getprop ro.product.device` </dev/null
while read line <&3
do
    # normal loop contents here...
done 3< <(adb devices)
这些重定向将输入传递到文件描述符#3上(0是标准输入,#1是标准输出,#2是标准错误,#3通常未使用)。使用此表单,您不必知道循环中的哪些命令可能会从标准输入读取,因此没有什么意外(如果它们确实需要从终端读取,那么它们可以!)。此外,与标准管道不同,它在主shell进程中运行循环,而不是在子shell中运行,从而避免了一些奇怪的情况(例如循环中设置的变量在循环之后不可用)


不过,有一个缺点:进程替换,
第一个建议仍然会打破while循环,但您最喜欢的解决方案仍然有效!非常感谢。第一个建议仍然打破while循环,但您最喜欢的解决方案仍然有效!非常感谢。