2012-07-08 164 views
3

我知道C(或爲什麼不C++)是這個的自然選擇,但出於個人原因,我想在Java中嘗試它。是否可以使用純Java編寫類似於bash的shell?

我想要實現什麼:

  • |
  • >
  • >>
  • 一些內置插件一樣echoif

我在考慮使用的ProcessBuilder,的PipedInputStream的,PipedOutp utStream和喜歡達到我的目標。

你認爲這是可能的而不依賴於JNI?

我應該使用一個像antlr這樣的工具來幫助我處理語法,還是您認爲我需要的是過度殺毒?

其他建議,材料?

+1

只要你不支持Windows,在Java中應該不會比任何其他語言困難得多。 – Mehrdad 2012-07-08 07:29:32

+0

[Java中實現POSIX shell的可能的副本](http://stackoverflow.com/questions/3399075/posix-shell-like-implementation-in-java) – jlliagre 2012-07-08 08:44:15

回答

1

這將是一個重複練習,但如果您只是爲了實現這一目的而執行此操作,您應該從控制檯處理部分開始jline,如果您想複製控制檯。 jline處理所有本地的東西,所以沒有JNI,你必須處理。 jline同樣適用於OSX,Linux和Windows。

ANTLR對於像這樣簡單的事情沒有任何好處,但像JSAP這樣的命令行解析器將會有用。

jline和JSAP會爲您提供構建shell支持的「命令」的功能shell和命令行解析所需的一切。

1

對此的唯一真正的挑戰是對輸入的實際解析,特別是如果你想模擬說bash例如,其中原因我肯定會使用Antlr來構建語法和相關的代碼。我不認爲使用Antlr會有些過分,因爲它有助於提供正確的解析,並使您的生活更輕鬆地實現實際的shell函數,因爲它將刪除您必須編寫的大部分代碼。有些地區可能需要JNI,但我認爲除了一些特殊情況外,它不會是代碼中非常重要的一部分。

我會看看其他shell的實現,我也知道有幾門大學課程涵蓋了與此類似任務的操作系統。

1

是的,這是可能的。確實已經完成了,在JNode。 JNode包含一個名爲「bjorne」的shell,它或多或少是完整的,並且或多或少地兼容POSIX。

目前的形式是「bjorne」運行在JNode操作系統上/下執行的命令,而不是在Linux或Windows平臺上執行。因此,用於啓動命令的「界面」不依賴於fork/exec或Process,就像在經典JVM上需要的實現一樣。但那是練習的重點......


如果要實現這個自己,ANTLR的幫助不大,因爲基本的shell語法是上下文敏感的。此外,實施POSIX的「硬件」在獲得引用和擴展的權利,以及處理子框架,重定向等等。

1

這是可能的,特別是簡單的要求,如| > >>for。但是,如果沒有本機代碼,你將無法實現一些像exec這樣的功能。您可以使用JShell作爲起點。儘管如此,仍然需要做一些工作來使其能夠與當前的JDK和庫進行編譯。

相關問題