странное поведение adb, если скрипт передан в bash - PullRequest
0 голосов
/ 06 апреля 2020

Я наткнулся на странное поведение, которое не могу объяснить. Я пытался сузить проблему. У меня есть следующий тестовый скрипт. sh script:

echo before
adb shell ls
echo after

Если я запускаю скрипт с bash -x testscript.sh, все работает как положено, и я получаю следующий вывод:

+ echo before
before
+ adb shell ls
acct
bin
bugreports
...
sdcard
storage
sys
system
ueventd.rc
vendor
+ echo before
before

Но если я запускаю скрипт как конвейерный скрипт с cat testscript.sh | bash -sx, я получаю следующий вывод:

+ echo before
before
+ adb shell ls
acct
bin
bugreports
...
sdcard
storage
sys
system
ueventd.rc
vendor

Последний echo after не выполняется, и я не могу понять, почему. Скрипт работает на сервере Ubuntu 18.04. Это adb из официального пакета Ubuntu.

$ adb --version
Android Debug Bridge version 1.0.39
Version 1:8.1.0+r23-5~18.04
Installed as /usr/lib/android-sdk/platform-tools/adb
$ bash --version
GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)

Пожалуйста, кто-нибудь может подсказать мне, что здесь происходит.

1 Ответ

1 голос
/ 06 апреля 2020

Когда вы запускаете скрипт с bash scriptname, стандартный ввод всех команд, которые он выполняет, все еще подключен к терминалу. Поэтому adb будет считывать свой стандартный ввод с терминала.

Когда вы перенаправляете ввод bash, это перенаправление наследуется adb. Если вы не используете опцию -n для adb shell, она будет считывать дополнительный ввод со стандартного ввода и отправлять его на удаленную систему в качестве возможного ввода для команды, которую вы запускаете (она не знает, что ls не читает стандартный ввод).

Измените его на

adb shell -n ls
...