我无法解释一个奇怪的行为。我试图缩小问题的范围。我有以下测试testscript.sh脚本:
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)
请有人启迪,这是怎么回事。
答案 0 :(得分:1)
使用bash scriptname
运行脚本时,其运行的所有命令的标准输入仍连接到终端。因此adb
将从终端读取其标准输入。
重定向bash
的输入时,此重定向将由adb
继承。除非您在-n
中使用adb shell
选项,否则它将从标准输入中读取其他输入,并将其作为运行命令的可能输入发送到远程系统(不知道{{1 }}不会读取标准输入。
更改为
ls