当我在我的计算机上运行adb shell "read VAR?PROMPT"
时,我得到PROMPT
,但我输入的内容似乎实际上都没有发送到远程shell(我必须按Ctrl + C来杀死adb shell
1}}过程)。它在我使用交互式shell时有效,因此它看起来只有adb shell <command>
地图stdout
而不是stdin
。
我可以使用一些解决方法将输入发送到非交互式命令吗?
答案 0 :(得分:2)
我知道这个问题已经存在了很长一段时间,但我发现自己遇到了同样的问题(不同的用例),我可以为我的具体情况找到合适的解决方案。
如果此另一个question中建议的解决方案对您不起作用(for 我不这样做,以下分析让我得到了自己的答案。
如果你浏览adb的源代码(我使用this one来获得这个答案),你会看到在commandline.cpp中,对于“adb shell”的情况,实现是不同的,具体取决于参数的数量(或者只是“shell”或“shell [args]”)。该源文件中的以下代码片段显示它(在函数adb_commandline中):
//[...]
if (!strcmp(argv[0], "shell") || !strcmp(argv[0], "hell")) {
char h = (argv[0][0] == 'h');
if (h) {
printf("\x1b[41;33m");
fflush(stdout);
}
if (argc < 2) {
D("starting interactive shell\n");
r = interactive_shell();
if (h) {
printf("\x1b[0m");
fflush(stdout);
}
return r;
}
// non-interactive shell. Here the arguments after "shell" are parsed.
// [...]
}
这意味着adb仅在命令行为“adb shell”时以交互方式运行,而在具有更多参数时以非交互方式运行。
因此,您需要更改源代码以使adb将任何“shell”视为交互式,而不管“shell”之后的参数数量。
我希望这有助于您解决用例问题。