2013-08-16 49 views
0

当我在我的电脑上运行adb shell "read VAR?PROMPT",我得到了PROMPT,但没有I型似乎实际上被发送到远程shell(我有按Ctrl + C杀adb shell处理)。它在我使用交互式外壳时起作用,因此它看起来像adb shell <command>仅映射stdout而不是stdin从“亚行外壳<command>”读取输入交互

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

+0

如果你更详细地描述你的用例,它会有所帮助。你想达到什么目的? –

+0

我在Android手机上编写了一个交互式脚本,该脚本使用'read'在各个点暂停,并在特定时间读取变量。我曾经从交互式的'adb shell'中调用这个脚本。现在我想从本地脚本调用(远程)脚本,在运行脚本之前自动执行一些操作(例如推送文件),但交互式脚本不再起作用。 – nneonneo

+0

您必须重写您的远程脚本逻辑才能在PC端完全运行。 –

回答

2

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

如果在其他question建议的解决方案不适合你( 我没有),下面的分析让我自己的答案。

如果您浏览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壳”,和非交互。

因此,您需要更改源代码以使adb将任何“shell”视为交互式,无论“shell”之后的参数数量如何。

我希望这可以帮助您解决您的使用案例。