我如何在Java中运行已安装的终端命令?

问题描述 投票:0回答:1

我最近正在编写一个使用ProcessBuilder来运行终端命令的程序,但是每当我运行该程序时,都会出现此错误:

java.io.IOException: Cannot run program "convert": error=2, No such file or directory
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1128)
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1071)
    at Downloader.uncompressImage(Downloader.java:37)
    at Main.main(Main.java:51)
Caused by: java.io.IOException: error=2, No such file or directory
    at java.base/java.lang.ProcessImpl.forkAndExec(Native Method)
    at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:319)
    at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:250)
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1107)
    ... 3 more

我非常确定此错误是因为它找不到“转换”命令的位置,因为这是我在计算机上安装的ImageMagick使用的命令。我知道该命令有效,因为如果我在常规终端窗口中键入命令,它将起作用。

如果情况是需要指定“转换”命令的位置,我仍然不知道它在哪里,所以如果回答这个问题的人也可以告诉我如何找到它,那将是惊人的。

总之,我很确定convert命令是引起错误的命令,因为它是第三方命令,所以我的问题是,如何在没有收到错误消息的情况下使用convert命令,以及解决方案是否需要我找到了convert命令的目录,我该怎么做?

如果有人想查看引起错误的代码,就是这样:

public void uncompressImage (String name, boolean back, String path) {

        String b = "";  

        name = name.toLowerCase().replace("-", "").replace(" ", "").replace(".", "");

        if (back) {

            b = "-back";

        }

        ProcessBuilder pb = new ProcessBuilder();

        String[] args = new String[] {"convert" , name + b + ".gif", "-coalesce", name + b + ".gif"};

        try {
            pb.command("cd " + path);
            pb.command(args);
            Process process = pb.start();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

(此代码在MacOS上运行)

编辑:我已经尝试检查pathname,并且两者都正确。

java terminal processbuilder
1个回答
2
投票

使用ProcessBuilder.directory(File)代替ProcessBuilder.directory(File)。添加cd以查看发生了什么。并记住要完成inheritIO()。喜欢,

inheritIO()

您可能还需要将waitFor()更改为waitFor()(取决于安装方式和安装位置。)>

© www.soinside.com 2019 - 2024. All rights reserved.