Android 运行adb命令的Shell脚本会中断while循环
我正在编写一个bin bash shell脚本,以便一次从多个设备收集信息。然而,我注意到,如果在while循环中执行任何adb命令,就会中断它。不知道为什么,因为循环显然不完整。我知道有多个feed在讨论这个话题,但我找不到类似的问题。任何建议都会有帮助。多谢各位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
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循环,但您最喜欢的解决方案仍然有效!非常感谢。