2017-06-19 7 views
2

シェルスクリプトループから複数のadbコマンドを実行すると、ほとんどのコマンドが実行されません。なぜADBコマンドはbashスクリプトループを破るのですか?

これはスクリプト例です。

スクリプト名: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." 

をコメントアウトのadbコマンドによる出力は、私が接続されている5つのデバイスを持っています。 adbコマンドなしでbashファイルから実行すると、これが出力になります。 5つのループのそれぞれを反復します。 adb shellコマンドは、最初のループの反復行のみ正しくコメントアウトある場合ADBコマンド

を含むループを有する

 
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. 

出力。これは、コメントを解除adbコマンドで出力されます:

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

Finished. 

誰かがこの行動とどのようなすべてのラインと処理されるすべてのループを持っているために行わなければならないと説明できますか?ところで

、このスクリプト(一方のライナコマンドおよび出力)に供給される出力である:

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

ベスト推測 - 'adb'コマンドがstdinを消費しています。 'adb'コマンドでstdin'

+0

ありがとう!できます。あなたが解決の形であなたの決議を記入したら、私は答えを受け入れ、寄付をupvoteします。 –

答えて

5

adb shellは、一般にEOFまでSTDIN消費するデバイス上で実行中のコマンドに標準入力を接続しますが達成された。したがって、これらのコマンドは残りのデバイス名をすべて消費し、ループを終了させます。

stdinをリダイレクトしてファイル名を指定して実行adbので、彼らはあなたが上のループにしようとしているものをいじりせずにすぐにEOFを取得:

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

また、 'adb shell -n <あなたのコマンド>'を使って標準入力からの読み込みを防ぐことができます – ldanko

1

@ ChrisDoddの根本原因の分析が正しいと彼のソリューションは、中に正常に動作している間一般的には、adb自動化の目的のために、単純なadbシェルコマンドにはadb </dev/null shellの代わりにadb exec-outを使用することをお勧めします。

awkを既に使用している場合は、なぜgrepを使用しますか? adb exec-outについては

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 

あなたは(デバイスの場合またはadbdadbやや最近のを持っているホストPCとデバイスの両方を必要とする動作するバージョン - platform-tools V24の+とAndroid 5.1+を行う必要があります。

+0

デバイスとの通信のためにたくさんのタスクに 'adb'を使います。私は、自分のコンピュータ、大きなキーボード、複数の画面を使って自分のデバイス/コンピュータ時間の99%を費やしています。 ** adb **コマンドの多くの機能は貴重です。私は長い間このこと(私の限界だったもの)に困惑していました。私は 'adb

+0

ありがとう!私は** grep **をこのケースで使用しましたが、問題の説明と私が探していたものを簡単にテストできるツールからサンプルブロックをすばやく取っていました。私はそれを微調整するのに少し時間を費やした。私は多くの冗長性を取り除いたが、私はまだそれを取り除くことができたと思う。それを掲示した後、あなたが指摘した冗長性を含めて、実行可能なクリーンアップがあることがわかりました。私は表現のバリエーションのいくつかが実際の問題と解決策に大きな違いを見出すことはありません。 –

+0

あなたの答えは質問の**入力/リダイレクトの問題**に対処していませんが、提供したスクリプトの例では、exec-outのメリットが説明されています。貢献に感謝します。私は、あなたの答えをbashスクリプトでadbを使用する利点があるとアップビューしています。しかし、それが質問の誤りに対処すれば、私は何かが欠けている。 –

関連する問題