如果脚本通过管道传输到bash中,将出现奇怪的adb行为

时间:2020-04-06 14:41:25

标签: linux bash adb

我无法解释一个奇怪的行为。我试图缩小问题的范围。我有以下测试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)

请有人启迪,这是怎么回事。

1 个答案:

答案 0 :(得分:1)

使用bash scriptname运行脚本时,其运行的所有命令的标准输入仍连接到终端。因此adb将从终端读取其标准输入。

重定向bash的输入时,此重定向将由adb继承。除非您在-n中使用adb shell选项,否则它将从标准输入中读取其他输入,并将其作为运行命令的可能输入发送到远程系统(不知道{{1 }}不会读取标准输入。

更改为

ls
相关问题