【问题标题】:POSIX shell like implementation in JavaPOSIX shell 类似 Java 中的实现
【发布时间】:2016-10-15 18:12:27
【问题描述】:
  1. 有谁知道类似 POSIX shell 的语言的实现,用于在 Java 中编写脚本?

  2. 如果这不可用,有人知道我可能错过的某处是否有可用的 ANTLR 或 JavaCC 语法吗?

编辑: 我知道我有可用于编写脚本的 Jython、JRuby、Groovy、JavaScript,但它们都没有类似 bash 的语法。

这不会用于编写 Java 代码的脚本,而是允许人们运行可与大型第三方媒体资产管理系统一起操作的预定义命令。

我想运行类似的东西:

ls | grep "something" > output

ls 和 grep 是 Java 命令。 (这仅用于说明目的)

谢谢

【问题讨论】:

  • 只是想知道你有没有找到一个纯 java shell 解决方案,它有一个简单的 *nix shell,包括命令?
  • 不,我没有找到。可能它不存在(还)。但我接受的解决方案也同样有效。好的,它不那么可移植,但是再一次没有真正可移植的仅 Java 控制台 i/o 库可用于制作外壳。没有行编辑支持。

标签: java bash grammar


【解决方案1】:
  1. 我所知道的所有 POSIX shell 实现都是用 C 编写的,但我没有特别研究过这个问题。

  2. POSIX shell(我假设这就是您所说的类 bash)语法相当复杂。词法分析和解析之间没有明确的区别。另一方面,解析几乎不需要任何回溯。所以解析器生成器可能没有太大帮助。

编辑,因为您已经阐明了您想要的 shell 语法:

我认为您最好的选择是使用现有的外壳。以下是一些架构注意事项:

  • 您可以将您的应用程序链接到现有的 shell。添加操纵您的资产管理系统的内置插件。可能存在许可问题。这为每个 shell 实例提供了一个应用程序实例。

  • 您可以使用简单的客户端-服务器架构,其中服务器是应用程序的一部分,只响应没有控制逻辑的简单命令,客户端链接到 shell 中,不直接访问应用程序数据。一些 shell(bash、ksh、zsh)已经有了 TCP 访问的方法。

    您可能不需要重新发明通信协议;考虑使用 HTTP(S),服务器和客户端的实现是现成的。事实上,您甚至可以在客户端只使用 wget 或 curl 脚本,因此根本不需要修补 shell(这会使客户端保持复杂的状态)。

如果您需要修补外壳(例如,添加内置程序),请考虑 zsh,它有一个模块系统。您的应用程序(或客户端部分)将显示为一个模块,该模块定义了内置函数和您需要的任何其他内容(例如,zsh 发行版包括用于 ftp 和 mmap 之类的模块)。

【讨论】:

  • +1 对于带有 C 实现思想的链接!否则,是的,我的意思是 POSIX shell,谢谢。我不会使用现有的脚本,而是使用知道如何在 bash 中做事的现有人员。我会暂时离开这个,如果没有人建议 Java 实现,我会接受你的回答
  • 还有一个不依赖于 Cygwin 的 Windows zsh 端口。耶!
  • @Jaka:有吗?我只知道古董。我看到 [zsh-nt.sourceforge.net/](WinZsh) 已经复活了,但它仍然是 10 年前的版本。还是你找到别的东西了?
  • 我写评论太快了。我刚刚看到“复活”的最新版本,日期为 2010-02-16。后来我才意识到实际发布的是什么:)
【解决方案2】:

Groovy 允许编写脚本 - 语法接近 Java

【讨论】:

    【解决方案3】:

    我不确定您在寻找什么——比如JShellRhino(Java 中的 Javascript 实现)之类的东西? Groovy(一种为 JVM 生成代码的动态语言)之类的东西?

    【讨论】:

    • 类似 JShell 的东西。但是JShell处于这样的状态,如果我从头开始,对我来说基本上是一样的
    【解决方案4】:

    你可以试试 Groovy Shell http://groovy.codehaus.org/Groovy+Shell

    或豆壳http://www.beanshell.org/

    两者都是在 jvm 中运行的动态语言,并且具有接近 java 的语法,同时允许您调用任何现有的 java 类。

    【讨论】:

      【解决方案5】:

      您可以尝试使用具有解析 POSIX、GNU 等命令行参数的实现的 Apache Commons CLI 库。

      【讨论】:

        【解决方案6】:

        crashub bash

        这里有一个纯 Java bash 解释器实现:

        它目前没有实现一个完整的基于 bash 的 shell,但它可能是解决部分语法问题的一个好的开始。

        【讨论】:

          【解决方案7】:

          看看这个讨论:http://www.antlr.org/pipermail/antlr-interest/2006-May/016235.html

          我猜你不需要完整的语法。定义一种语言的子集,进行一些实验。也许你甚至不需要 antlr,你可以手动编写一个解析器。或者使用scala,你可以把它变成你需要的任何语言。

          【讨论】:

          • 我知道 YACC Bash 语法。我看过它,它伤害了我的眼睛。 :) 似乎还没有人将 YACC 制作为 ANTLR 翻译器。这可能也不容易,因为 ANTLR 是 LL(*) 和 LALR。
          猜你喜欢
          • 2019-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多