【问题标题】:How can I open another command line application in Linux from a Java program?如何从 Java 程序在 Linux 中打开另一个命令行应用程序?
【发布时间】:2014-09-07 15:55:27
【问题描述】:

我正在尝试编写一个小型 Java 命令行应用程序,它将创建一个新文件,然后使用存储在 $EDITOR 中的系统默认编辑器打开它,然后在编辑器关闭后退出。

到目前为止,没有运气,我尝试了以下方法:

Desktop dt = Desktop.getDesktop();
dt.edit(file);

这种方法产生了一个UnsupportedOperationException,这有点道理,因为我是从终端运行我的程序,而不是从桌面运行 Java 应用程序。

现在,我有这个:

Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(commandString); // "vim newfile"
proc.waitFor();

这个正在工作,但不是我需要的。当我跑步时

ps a | grep vim

我可以看到它确实在后台运行,文件名是我给它的:

1000 pts/1    S+     0:00 vim 2014-07-16.23-02

关于如何让它在前台运行的任何想法?

【问题讨论】:

    标签: java linux command-line-interface


    【解决方案1】:

    vim 和许多交互式程序一样,期望它的stdin 是一个可以发送ioctl 调用的真实终端。但是通过Runtime.exec()执行时stdin会被重定向到父进程(见Javadoc on Process for more information)。

    在 Java 7 中,您应该能够使用 ProcessBuilder.inheritIO() 传递文件句柄。 (免责声明:我没试过,YMMV。)

    【讨论】:

    • 我希望找到 Java 6 的解决方案,但看起来需要 Java 7 才能完成这项工作。
    • @grimetime:如果您卡在 Java 6 上,您可以随时使用 JNI 在本机代码中执行 fork()。当然,你必须处理引入特定于平台的 JNI 依赖项的痛苦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 2018-04-27
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    相关资源
    最近更新 更多