我正在嘗試(和失敗)來研究如何從Java內部運行完全交互式的shell程序。在Java中運行交互式shell程序
這裏的情景:
我有一個大的GUI應用程序,它是跨平臺和Java編寫的。爲此,我試圖添加一個用於運行無頭的交互式命令行環境。事情的這一面都很好,很棒。但是,主GUI的其中一個功能是編輯文件。現在,對於命令行界面,我希望能夠執行一個外部編輯器來編輯這些文件,然後在我保存並退出後返回到我所在的位置。例如,在Linux上它可以執行「vi/path/to/file」。
那麼,我怎樣才能以鍵盤和顯示器與應用程序完全互動的方式執行該命令呢?我不希望它在後臺運行。我不希望它通過Java重定向IO,我只希望這一個命令在「前臺」運行,直到它存在。
就像,好像我用的system()
功能C.
到目前爲止,我發現一切都在後臺運行或管IO通過Java,這將不用於交互式(非行工作命令模式)應用程序。
哦,還有一個最後的警告:我僅限於Java 1.6的兼容性,所以我不能用ProcessBuilder
做一些奇特的事情。
這裏的強制性SSCCE:
class exetest {
public static void main(String[] args) {
try {
Process p = Runtime.getRuntime().exec("vi");
p.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}
}
我期望調用Runtime.getRuntime()EXEC()阻塞,直到我在vi
已經完成,在此期間的所有鍵盤輸入會去直接(RAW
因爲它是已知的)到vi
,並且所有屏幕輸出將直接返回到用戶的原始狀態。
這是我將如何實現它在C:
void main() {
system("vi");
}
更新:
這實現了預期的結果,而是一種)被限制到Linux/OSX(沒有那麼多的一個問題,但會很高興地把它跨平臺),和b)是一個可怕的雜牌組裝電腦:
import java.io.*;
class exetest {
public static void main(String[] args) {
try {
Process p = Runtime.getRuntime().exec("/bin/bash");
OutputStream stdin = p.getOutputStream();
PrintWriter pw = new PrintWriter(stdin);
pw.println("vi </dev/tty> /dev/tty");
pw.close();
p.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}
}
你想要類似https://github.com/ronniedong/Expect-for-Java? –
不,我不知道。我不希望Java與執行的程序進行交互,我希望用戶與它進行交互。所以他們輸入'edit myfile'並執行'vi/path/to/myfile',然後用戶編輯文件,就好像他們在終端輸入了'vi/path/to/myfile'一樣。 – Majenko