2013-08-16 48 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」之後的參數數量如何。

我希望這可以幫助您解決您的使用案例。