当我adb shell "read VAR?PROMPT"
在我的计算机上运行时,我得到了PROMPT
,但我输入的任何内容似乎实际上都没有发送到远程 shell(我必须按 Ctrl+C 来终止adb shell
进程)。它在我使用交互式 shell 时有效,因此它看起来像adb shell <command>
只有地图stdout
而不像stdin
.
是否有一些解决方法可以用来将输入发送到非交互式命令?
当我adb shell "read VAR?PROMPT"
在我的计算机上运行时,我得到了PROMPT
,但我输入的任何内容似乎实际上都没有发送到远程 shell(我必须按 Ctrl+C 来终止adb shell
进程)。它在我使用交互式 shell 时有效,因此它看起来像adb shell <command>
只有地图stdout
而不像stdin
.
是否有一些解决方法可以用来将输入发送到非交互式命令?
我知道这个问题已经存在了很长一段时间,但我发现自己遇到了同样的问题(虽然用例不同),我可以为我的具体情况找到合适的解决方案。
如果这个其他问题中建议的解决方案对您不起作用(对我来说没有),以下分析让我得到了自己的答案。
如果您浏览 adb 的源代码(我在这个答案中使用了这个),您会看到在 commandline.cpp 中,“adb 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”之后的参数数量如何。
我希望这可以帮助您找到解决用例的方法。