从“adb shell <command />”以交互方式读取输入

时间:2013-08-16 14:19:29

标签: adb

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

我可以使用一些解决方法将输入发送到非交互式命令吗?

1 个答案:

答案 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”之后的参数数量。

我希望这有助于您解决用例问题。