我如何 运行 在 java 中安装终端命令?
How do I run an installed terminal command in java?
我最近正在编写一个程序,该程序使用 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
我很确定这个错误是因为它找不到 "convert" 命令所在的位置,因为这是我在我的计算机上安装的 ImageMagick 使用的命令。我知道该命令有效,因为如果我在常规终端中输入命令 window 它有效。
如果需要指定 "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 上 运行ning)
编辑:我已经试过检查 path
和 name
,它们都是正确的。
使用 ProcessBuilder.directory(File)
instead of cd
. Add inheritIO()
to see what is going on. And remember to waitFor()
你的 Process
完成。喜欢,
try {
pb.inheritIO();
pb.directory(new File(path));
pb.command(args);
Process process = pb.start();
process.waitFor();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
您可能还需要将 "convert"
更改为 "/usr/local/bin/convert"
(取决于您安装它的方式和位置)。
我最近正在编写一个程序,该程序使用 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
我很确定这个错误是因为它找不到 "convert" 命令所在的位置,因为这是我在我的计算机上安装的 ImageMagick 使用的命令。我知道该命令有效,因为如果我在常规终端中输入命令 window 它有效。
如果需要指定 "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 上 运行ning)
编辑:我已经试过检查 path
和 name
,它们都是正确的。
使用 ProcessBuilder.directory(File)
instead of cd
. Add inheritIO()
to see what is going on. And remember to waitFor()
你的 Process
完成。喜欢,
try {
pb.inheritIO();
pb.directory(new File(path));
pb.command(args);
Process process = pb.start();
process.waitFor();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
您可能还需要将 "convert"
更改为 "/usr/local/bin/convert"
(取决于您安装它的方式和位置)。