把Java作为Linux Shell脚本语言使用?

3

我以前使用过cshell/tcshell,然后转向使用Python。

现在我想要将所有的shell脚本、GUI、数据库和网页集成在一起。Python在大多数工作中表现良好,但相对于GUI、总体性能和第三方库而言比较弱。

因此,我打算尝试Java作为我的主要开发语言。它是否擅长于shell交互式编程、进程控制等等呢?

非常感谢。

4个回答

3

如果你想使用Java平台作为脚本语言,请查看Groovy


3

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方法可以解决这个问题。无论如何,使用Java编写shell脚本主要问题是JVM启动时间需要相当长的一段时间。主要原因当然是磁盘的问题。 - bestsss
FileChannel.transferTo 也不是更好的选择。你仍然需要为源文件和目标文件创建两个文件句柄,并手动循环以传输数据。这对于像复制这样简单的操作来说,需要大量的代码。相比之下,使用 Apache 的 commons.io 库中的一行代码 FileUtils.copyFile(file1, file2) 就可以完成。启动时间可能会慢一些,但正如我所提到的,你可以使用 Nailgun 来解决这个问题,它可以预加载 JVM 并允许你在每次启动程序时重用它。Nailgun 可以用于任何基于 JVM 的语言。 - rodion
我看不出问题,你可以使用Apache库或拥有自己的类/方法。至于Nailgun(刚刚检查了源代码):它是一种软件(专用服务器),可以在多次调用的情况下加速某些命令。如果不保护静态数据或长时间休眠的线程,则需要非常良好行为的“插件”来清理所有内容,包括文件句柄。运行单独的进程可以避免可能出现的错误、未关闭的句柄、内存泄漏等所有问题。 - bestsss
顺便提一下,JDK7有一个单行复制(和移动)实用程序。http://download.java.net/jdk7/docs/api/java/nio/file/Files.html#copy%28java.nio.file.Path,%20java.nio.file.Path,%20java.nio.file.CopyOption...%29 - bestsss
@bestsss 我的意思是说Java没有内置函数来处理日常shell脚本任务。好吧,你只需要使用像commons.io这样的库,问题就解决了,我同意这一点。至于Nailgun,出于你所描述的原因,我不会在生产中使用它,但它适用于开发和测试脚本。启动时间也取决于你的机器。在我的桌面机上,JVM在客户端模式下启动时间不到一秒钟。但Groovy、JRuby等则需要更长的时间,但这是否真的对你构成了障碍,将取决于你的需求。 - rodion
只需从Java中执行“cp”。毕竟,这就是bash所做的。 - Bart van Heukelom

1

JVM启动通常很慢,而且占用的内存相对于本地应用程序来说也比较大。因此,它不适合运行许多(并行)经常启动和关闭的小型应用程序(进程)...如果这是你的意图的话。


0

我编写了jpad,以允许运行Java“shell脚本”和交互式片段,同时还提供结果的良好可视化。这展示了我的意思:

JPad Java REPL

使用此脚本语言复制文件,您可以使用以下命令: 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接