2017-06-19 1 views
2

Ich bemerke ein Problem, wenn mehrere Adb-Befehle von einer Shell-Skript-Schleife ausgeführt werden die meisten der Befehle nicht ausgeführt.Warum brechen ADB-Befehle eine Bash-Skript-Schleife?

Dies ist ein Beispielskript.

Skriptname: adbscript.sh:

#!/bin/bash 

devicecount=0 
while read device; do 
    ((devicecount++)) 
    serialno="NA" 
    appinstallcount="NA" 
    echo "Processing Device #$devicecount: $device" 
    # serialno=$(adb -s $device shell getprop ro.serialno) 
    # appinstallcount=$(adb -s $device shell pm list packages | wc -l) 
    echo -e "Device: $device | Serialno: $serialno | Apps installed: $appinstallcount\n" 
done < <(adb devices | egrep "\bdevice\b" | awk '{print $1}') 
echo "Finished." 

Ausgabe mit adb Befehle auf Kommentar

Ich habe 5 Geräte angeschlossen. Beim Ausführen von der Bash-Datei ohne die adb Befehle ist dies der Ausgang. Es iteriert durch jede der 5 Schleifen.

 
Processing Device #1: 192.168.15.93:5123 
Device: 192.168.15.93:5123 | Serialno: NA | Apps installed: NA 

Processing Device #2: 192.168.15.95:5123 
Device: 192.168.15.95:5123 | Serialno: NA | Apps installed: NA 

Processing Device #3: emulator-5554 
Device: emulator-5554 | Serialno: NA | Apps installed: NA 

Processing Device #4: 31005c77c8cfb200 
Device: 31005c77c8cfb200 | Serialno: NA | Apps installed: NA 

Processing Device #5: 98883837594d4f5453 
Device: 98883837594d4f5453 | Serialno: NA | Apps installed: NA 

Finished. 

Output mit Schleife enthält ADB Befehle

Wenn der Befehl ist adb shell uncommented es nur dann richtig iteriert Linien der ersten Schleife. Dies ist die Ausgabe mit dem Befehl adb unkommentiert:

 
Processing Device #1: 192.168.15.93:5123 
Device: 192.168.15.93:5123 | Serialno: 98883837594d4f5453 | Apps installed: 442 

Finished. 

Kann jemand dieses Verhalten erklären und was getan werden muß, um alle Linien zu haben und alle Schleifen verarbeitet?

Durch die Art und Weise, dies ist der Ausgang an das Skript (einzeiler Befehl und Ausgang) zugeführt wird:

$ adb devices | egrep "\bdevice\b" | awk '{print $1}' 
192.168.15.93:5123 
192.168.15.95:5123 
emulator-5554 
31005c77c8cfb200 
98883837594d4f5453 
+1

Beste Schätzung - die 'adb'-Befehle verbrauchen stdin. Versuchen Sie, stdin '

+0

Danke! Es klappt. Wenn Sie Ihren Entschluss in Form einer Antwort formulieren, akzeptiere ich die Antwort und stimme den Beitrag zu. –

Antwort

5

adb shell stdin auf den Befehl auf dem Gerät verbindet, ausgeführt wird, das stdin allgemeinen verbrauchen, bis ein EOF ist erreicht. Diese Befehle verbrauchen also alle übrigen Gerätenamen, wodurch die Schleife beendet wird.

Run adb mit stdin-Umleitung, so dass sie erhalten eine sofortige EOF ohne Unordnung, was Sie Schleife über du versuchen:

serialno=$(adb </dev/null -s $device shell getprop ro.serialno) 
appinstallcount=$(adb </dev/null -s $device shell pm list packages | wc -l) 
+0

Sie können auch 'adb shell -n ' verwenden, um das Lesen von stdin zu verhindern – ldanko

1

Während der @ ChrisDodd Ursachenanalyse ist richtig und seine Lösung funktioniert gut in allgemein, für adb Automatisierungszwecke ist es vorzuziehen, adb exec-out anstelle von adb </dev/null shell für einfache adb Shell-Befehle zu verwenden.

Auch warum grep verwenden, wenn Sie bereits awk verwenden?

for device in $(adb devices | awk '$2=="device"{print$1}') 
do 
    serialno=$(adb -s $device exec-out getprop ro.serialno) 
    appinstallcount=$(adb -s $device exec-out pm list packages | wc -l) 
    ... 
done 

Für adb exec-out arbeiten Sie Ihren Host benötigen beide PC und Geräte haben etwas letzten adb (oder adbd bei Geräten) Version - platform-tools v24 + und Android 5.1+ tun sollten.

+0

Ich benutze 'adb' für viele Aufgaben zur Kommunikation mit meinen Geräten.Ich gebe 99 Prozent meiner Geräte-/Computerzeit mit meinem Computer, der großen Tastatur und mehreren Bildschirmen aus. Daher sind die vielen Funktionen des Befehls ** adb ** wertvoll. Ich war über diese lange Zeit (was für mich eine Einschränkung gewesen war) ziemlich ratlos gewesen. Ich habe die 'adb

+0

Danke! Ich benutzte ** grep ** in diesem Fall, während ich schnell einen Beispielblock von einem meiner Werkzeuge nahm, der leicht getestet werden konnte, um eine Beschreibung meines Problems und was ich suchte, zu zeigen. Ich habe ein wenig Zeit damit verbracht, es zu optimieren. Ich habe viel Redundanz entfernt, aber ich sehe, ich hätte noch mehr entfernen können. Nachdem ich es gepostet habe, stelle ich fest, dass einige Säuberungen durchgeführt werden können, einschließlich der Redundanz, auf die Sie hingewiesen haben. Ich sehe nicht, dass einige Variationen des Ausdrucks für das eigentliche Problem und die Lösung viel ausmachen. –

+0

Während Ihre Antwort das ** Eingabe-/Umleitungsproblem ** der Frage nicht behandelt, erläutert das von Ihnen bereitgestellte Skriptbeispiel die Leistung des Exec-Out. Nochmals vielen Dank für den Beitrag. Ich bin upvoting Ihre Antwort als Vorteil für die Verwendung von AdB in Bash-Skripten. Aber wenn es den Fehler der Frage anspricht, vermisse ich etwas. –