【问题标题】:Use java as a linux shell script language?使用 java 作为 linux shell 脚本语言?
【发布时间】:2011-09-08 06:10:30
【问题描述】:

我之前使用过 cshell/tcshell,然后转向 python。

现在我要将我所有的 shell 脚本、gui、数据库、网页集成在一起。 Python 擅长大部分工作,但在 GUI、一般性能和第三部分库方面相对较弱。

所以我打算尝试将 java 作为我的主要开发语言。是否擅长shell交互编程、过程控制等?

非常感谢。

【问题讨论】:

    标签: java shell


    【解决方案1】:

    Java 本身可能不是最好的 shell 语言,因为启动时间慢,缺乏与操作系统、命令和文件一起使用的内置库(我的意思是,甚至无法将文件复制到Java 没有求助于创建两个输入和输出流并管道传输数据,哎呀!)。

    但是!有很多基于 JVM 的语言,如 JRuby(ruby)、Rhino(javascript)、Jython(python)、Groovy 或Grash、Bean-shell 等,它们的工作方式类似于 shell 语言,并且可以运行其他 Java 编写的程序.我建议您查看Grash,这可能正是您所需要的。

    其中一些语言甚至有一种方法可以预加载 JVM 运行时以加快启动时间(例如 JRuby 的 Nailgun),从而可以解决启动时间缓慢的问题。另请参阅 this post 以了解使用 Ruby(JRuby) 作为 shell 语言。

    【讨论】:

    • 我的意思是,如果不通过创建两个输入和输出流并管道传输数据,甚至无法在 Java 中复制文件,哎呀! 这不是真的: FileChannel.transferTo。无论哪种方式,shell 脚本的主要问题是 JVM 启动需要相当长的时间。不过,罪魁祸首当然是磁盘。
    • FileChannel.transferTo 也好不到哪里去。您仍然必须为源文件和目标文件创建两个文件句柄并手动循环它以传输数据。对于像复制这样简单的事情,这是很多代码。将其与一行比较:FileUtils.copyFile(file1, file2) 使用 apache 的 commons.io 库。启动时间很慢,但是,正如我所提到的,您可以使用 Nailgun 来解决这个问题,它可以预加载 JVM 一次,并允许您在每次启动程序时重用它。 Nailgun 应该适用于任何基于 JVM 的语言。
    • 我没有看到问题,您可以使用 apache 库或拥有自己的类/方法。至于Nailgun(刚刚查看了源代码):它是一个软件(专用服务器),可以在多次调用的情况下加速某些命令。如果不保护静态数据,也不保护长时间的休眠线程,那么它将需要一个行为良好的“插件”来清理所有内容,包括文件句柄。运行单独的进程可以保存所有可能出现的错误、未关闭的句柄、内存泄漏等问题。
    • 旁注,jdk7 有一个单行复制(和移动)实用程序。 download.java.net/jdk7/docs/api/java/nio/file/…
    • @bestsss 我的意思是说 Java 没有开箱即用的日常 shell 脚本任务的内置函数。好吧,你只需要使用像 commons.io 这样的库,我同意,这就解决了这个问题。至于 Nailgun,由于您描述的原因,我不会在生产中使用它,但它对开发和测试脚本很有用。启动时间也取决于您的机器。在我的台式机上,JVM 在客户端模式下启动时间不到十分之一秒。虽然 Groovy、JRuby 等需要更长的时间,但这是否真的会成为您的障碍将取决于您的需求。
    【解决方案2】:

    如果您想将 Java 平台用作脚本语言,请查看 Groovy

    【讨论】:

      【解决方案3】:

      启动 JVM 通常很慢并且会占用大量内存(与本机应用程序相比) 因此,它不适合运行许多(并行)经常启动和终止的小型应用程序(进程)。 ...如果这是你的意图

      【讨论】:

        【解决方案4】:

        我编写了 jpad 以允许运行 java“shell 脚本”和交互式 sn-ps,同时还提供了很好的结果可视化。这说明了我的意思:

        要使用它作为脚本语言来复制文件,您可以使用: http://jpad.io/example/1I/fileio

        final File file = new File("outt.csv");
        Object o = new int[] {1,2,3};
        JPad.writeCsv(o, file);
        java.nio.file.Files.copy(file.toPath(), Paths.get("copy.csv"));
        

        你也可以从命令行运行:

        > more fileio.jpad
        final File file = new File("outt.csv");
        Object o = new int[] {1,2,3};
        JPad.writeCsv(o, file);
        java.nio.file.Files.copy(file.toPath(), Paths.get("copy.csv"));
        > jpad fileio.jpad
        > dir
        29/04/2017  13:30    <DIR>          .
        29/04/2017  13:30    <DIR>          ..
        29/04/2017  13:30                16 copy.csv
        29/04/2017  13:30               160 fileio.jpad
        29/04/2017  13:30                16 outt.csv
        

        【讨论】:

          猜你喜欢
          • 2012-11-24
          • 2016-04-15
          • 1970-01-01
          • 2020-06-04
          • 2016-06-23
          • 2012-05-12
          • 2014-03-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多