2016-05-05 19 views
2

Ich versuche, einen Befehl auszuführen und die Ergebnisse zu interpretieren, aber was auch immer ich mache, bekomme ich einen Fehler "Befehl nicht gefunden". Hier ist eine repräsentative Version meines Code:Bash Subshell Variable Befehl nicht gefunden

devicename="emulator-5554" 
search=$(adb devices | grep -w "$devicename" | grep -w device) 

until $search; do 
    echo "Waiting..." 
    sleep 10 
done 

Ich habe jede versuchten, die ich mir vorstellen kann, einschließlich ...

search=$(adb devices | grep -w $devicename | grep -w device) 

und

search=$(adb devices | grep -w ${devicename} | grep -w device) 

..., aber alle geben den gleichen Fehler zurück.

Wie kann ich die Variable richtig interpretieren?

Antwort

6

Der Code, den Sie haben, führt die adb|grep|grep Pipeline nur einmal und speichert die Ausgabe in $search. Lesen von $search führt die Pipeline nicht erneut aus.

Verwenden Sie keine Variablen, um Befehle zu halten. Verwenden Sie Funktionen.

search() { 
    adb devices | grep -w "$devicename" | grep -qw device 
} 

until search; do 
    echo "Waiting..." 
    sleep 10 
done 

Beachten Sie, dass ich -q die endgültige grep zum Schweigen hinzugefügt. Sie müssen nicht wissen, was es gefunden hat, nur dass es etwas gefunden hat. Sein Ausgangscode ist alles was zählt; seine Ausgabe ist irrelevant.

Sie könnten die Funktion inline, wenn Sie möchten.

until adb devices | grep -w "$devicename" | grep -qw device; do 
    echo "Waiting..." 
    sleep 10 
done 

Oder könnten Sie $devicename einen Parameter machen, wenn Sie es wünschen.

search() { 
    adb devices | grep -w "$1" | grep -qw device 
} 

until search "$devicename"; do 
    echo "Waiting..." 
    sleep 10 
done