當我在我的電腦上運行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端完全運行。 –