【问题标题】:Is it possible to write a shell similar to bash using only pure Java?是否可以仅使用纯 Java 编写类似于 bash 的 shell?
【发布时间】:2012-07-08 01:07:15
【问题描述】:

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

我想要实现的:

  • |
  • >
  • >>
  • 一些内置函数,如echoif

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

你认为不依赖 JNI 可以做到吗?

我应该使用 antlr 之类的工具来帮助我学习语法,还是您认为它对于我的需要来说是多余的?

还有什么建议、材料吗?

【问题讨论】:

标签: java bash shell


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        是的,这是可能的。事实上,它已经在 J​​Node 中完成了。 JNode 包含一个名为“bjorne”的外壳,它或多或少是完整的,或多或少是 POSIX 兼容的。

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


        如果您自己实现这一点,Antlr 不会有太大帮助,因为基本的 shell 语法是上下文相关的。此外,实现 POSIX 的“难点”在于正确引用和扩展,以及处理子shell、重定向等。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-12-03
            • 2020-09-14
            • 1970-01-01
            • 2013-06-08
            • 2017-01-18
            • 2021-12-05
            • 1970-01-01
            • 2012-09-30
            相关资源
            最近更新 更多