是否可以使用纯Java编写类似于bash的shell?

时间:2012-07-08 07:24:34

标签: java bash shell

我知道C(或者为什么不是C ++)是这个的自然选择,但出于个人原因,我想用Java来尝试。

我想要实施的内容:

  • |
  • >
  • >>
  • 一些内置插件,例如echoif

我正在考虑使用ProcessBuilder,PipedInputStream,PipedOutputStream等来实现我的目标。

你认为这可以不依赖JNI吗?

我是否应该使用像antlr这样的工具来帮助我理解语法,或者你认为这对我需要的东西有点过分了吗?

还有其他建议吗?

5 个答案:

答案 0 :(得分:1)

这将是一个重复练习,但如果你只是为了这样做,你应该从控制台处理部分的jline开始,如果你想复制一个控制台。 jline处理所有原生内容,因此您无需处理JNI。 jline同样适用于OSX,Linux和Windows。

ANTLR对于做这么简单的事情没有任何好处,但是像JSAP这样的命令行解析器将是有用的。

jline和JSAP将为您提供构建功能shell所需的一切,并为shell支持的“命令”解析命令行。

答案 1 :(得分:1)

唯一真正的挑战是输入的实际解析,特别是如果你想模拟说bash,例如,因为我肯定会使用Antlr来构建语法及其相关代码。我不认为使用Antlr会有点过分,因为它有助于提供正确的解析并使您的生活更容易实现实际的shell函数,因为它会删除您必须编写的大部分代码。有些领域可能需要JNI,但我认为除了一些特殊情况之外,它不会是代码中非常重要的一部分。

我会看看其他的shell实现,我也知道有一些大学课程涵盖了与此类似的任务的操作系统。

答案 2 :(得分:1)

是的,有可能。事实上,它已在JNode中完成。 JNode包含一个名为“bjorne”的shell,它或多或少是完整的,并且或多或少兼容POSIX。

问题在于,“bjorne”以其当前形式运行在JNode操作系统上/下执行的命令,而不是在Linux或Windows平台上执行。因此,用于启动命令的“接口”不依赖于fork / exec或Process,就像经典JVM上的实现所需要的那样。但这就是演习的重点......


如果您自己实现这一点,Antlr将无济于事,因为基本的shell语法是上下文敏感的。此外,实现POSIX的“硬位”是正确的引用和扩展,以及处理子壳,重定向等。

答案 3 :(得分:1)

http://www.beanshell.org/已存在多年,并且在许多IDE的调试器中用于评估表达式。

答案 4 :(得分:1)

有可能,尤其是| > >>for这样的简单要求。但是,如果没有本机代码,您将无法实现某些功能,如exec。您可以使用JShell作为起点。有一些工作要做,以便使用当前的JDK和库进行编译。