当我在我的电脑上运行adb shell "read VAR?PROMPT"
,我得到了PROMPT
,但没有I型似乎实际上被发送到远程shell(我有按Ctrl + C杀adb shell
处理)。它在我使用交互式外壳时起作用,因此它看起来像adb shell <command>
仅映射stdout
而不是stdin
。从“亚行外壳<command>”读取输入交互
是否有一些解决方法可用于将输入发送到非交互式命令?
当我在我的电脑上运行adb shell "read VAR?PROMPT"
,我得到了PROMPT
,但没有I型似乎实际上被发送到远程shell(我有按Ctrl + C杀adb shell
处理)。它在我使用交互式外壳时起作用,因此它看起来像adb shell <command>
仅映射stdout
而不是stdin
。从“亚行外壳<command>”读取输入交互
是否有一些解决方法可用于将输入发送到非交互式命令?
我知道这个问题在这里已经有一段时间了,但是我发现自己也遇到了同样的问题(不同的用例),我可以找到适合我的具体情况的解决方案。
如果在其他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”之后的参数数量如何。
我希望这可以帮助您解决您的使用案例。
如果你更详细地描述你的用例,它会有所帮助。你想达到什么目的? –
我在Android手机上编写了一个交互式脚本,该脚本使用'read'在各个点暂停,并在特定时间读取变量。我曾经从交互式的'adb shell'中调用这个脚本。现在我想从本地脚本调用(远程)脚本,在运行脚本之前自动执行一些操作(例如推送文件),但交互式脚本不再起作用。 – nneonneo
您必须重写您的远程脚本逻辑才能在PC端完全运行。 –