0

当我adb shell "read VAR?PROMPT"在我的计算机上运行时,我得到了PROMPT,但我输入的任何内容似乎实际上都没有发送到远程 shell(我必须按 Ctrl+C 来终止adb shell进程)。它在我使用交互式 shell 时有效,因此它看起来像adb shell <command>只有地图stdout而不像stdin.

是否有一些解决方法可以用来将输入发送到非交互式命令?

4

1 回答 1

2

我知道这个问题已经存在了很长一段时间,但我发现自己遇到了同样的问题(虽然用例不同),我可以为我的具体情况找到合适的解决方案。

如果这个其他问题中建议的解决方案对您不起作用(对我来说没有),以下分析让我得到了自己的答案。

如果您浏览 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”之后的参数数量如何。

我希望这可以帮助您找到解决用例的方法。

于 2015-06-12T08:05:53.610 回答