2017-09-24 51 views
1

我有一個交互式命令行程序,它具有Tab鍵完成功能(完成命令或列表可能的選項),當按Tab鍵時。Java Process API - 將Tab鍵按下事件發送到交互式外殼程序

我正在編寫另一個Java程序,它將使用ProcessBuilder作爲子進程啓動命令行程序。

我可以使用Process.getInputStream()Process.getOutputStream()將輸入傳遞給進程。

現在,我想觸發子進程中的自動完成。當我打印稅號'\t'時,它被視爲常規制表符,而不是觸發製表符自動完成。

有沒有辦法將按鍵或等效事件從Java進程發送到子進程?

+0

嘿傑克,你給看看這個HTTPS:/ /stackoverflow.com/questions/3537706/how-to-unescape-a-java-string-literal-in-java –

+0

這似乎不同。在這種情況下,如果我寫入字符'\ t',那麼子進程讀取單個製表符。當我發送「\\ t」(實際上是兩個字符)時,子進程會讀取兩個字符。但我想要的是,發送按鍵事件 – JackDaniels

+0

當程序認爲它被非交互式使用時,通常會禁用像完成這樣的功能;特別是對於bash(4.1),只有當shell沒有非選項參數且沒有-c選項[和]標準輸入和錯誤都連接到終端(由isatty(3)確定)時,readline才被啓用。 ,或...以-i選項開始「。默認情況下,Java'ProcessBuilder'和'Runtime.exec'總是使用管道作爲孩子的stdin/out/err,管道從isatty返回false。對於其他shell或程序檢查他們的文檔。 –

回答

0

你可以嘗試使用機器人

Robot robot = new Robot(); 
robot.mouseMove(x, y); //Select the console window at x,y 
robot.keyPress(KeyEvent.VK_TAB); //Send tab key 

或者還使用X11

運行OS特定命令,例如xdotool在Unix
xdotool windowactivate id && 
xdotool key Tab &&