2016-05-05 3 views
2

Я пытаюсь запустить команду и интерпретировать результаты, но что бы я ни делал, я получаю ошибку «команда не найдена». Вот представитель версии моего кода:Bash Subshell Variable Command не найден

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

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

Я перепробовал все изменения, которые я могу думать, в том числе ...

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

и

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

..., но все возвращают ту же ошибку.

Как я могу заставить переменную интерпретировать правильно?

ответ

6

Код, который вы только что пропустили только adb|grep|grep, и сохраняет его в $search. Чтение с $search не перезапускает конвейер.

Не используйте переменные для хранения команд. Используйте функции.

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

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

Обратите внимание, что я добавил -q, чтобы заставить замолчать окончательный Grep. Вам не нужно знать, что он нашел, просто что-то нашел. Его код выхода - это все, что имеет значение; его выход не имеет значения.

Вы можете встроить функцию, если хотите.

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

Или вы могли бы сделать $devicename параметр, если вы хотите.

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

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