在Java世界,我们常用ProcessBuilder运行bash命令,用法解释见两篇参考文献,这里直接上我的代码。
package org.example.bashrunner;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.concurrent.*;
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) throws IOException, InterruptedException, ExecutionException, TimeoutException {
ProcessBuilder processBuilder = new ProcessBuilder("bash", "-c", "ls /c");
Process process = processBuilder.start();
StreamGobbler streamGobbler = new StreamGobbler(process.getInputStream(), System.out::println);
Future<?> future = Executors.newSingleThreadExecutor().submit(streamGobbler);
int exitCode = process.waitFor();
assert exitCode == 0;
future.get(10, TimeUnit.SECONDS);
}
static class StreamGobbler implements Runnable {
private InputStream inputStream;
private Consumer<String> consumeInputLine;
public StreamGobbler(InputStream inputStream, Consumer<String> consumeInputLine) {
this.inputStream = inputStream;
this.consumeInputLine = consumeInputLine;
}
public void run() {
new BufferedReader(new InputStreamReader(inputStream)).lines().forEach(consumeInputLine);
}
}
}
在IDE运行这段代码,你会得到类似结果:
D:\sandbox\Java\jdk-17.0.2\bin\java.exe "-javaagent:D:\sandbox\JetBrains\IntelliJ IDEA Community Edition 2021.2.2\lib\idea_rt.jar=50411:D:\sandbox\JetBrains\IntelliJ IDEA Community Edition 2021.2.2\bin" -Dfile.encoding=UTF-8 -classpath D:\sandbox\code\bashrunner\target\classes;D:\sandbox\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;D:\sandbox\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;D:\sandbox\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar org.example.bashrunner.Main
$Recycle.Bin
$WinREAgent
Config.Msi
Documents and Settings
DumpStack.log
DumpStack.log.tmp
IQIYI Video
Intel
LenovoQMDownload
PerfLogs
Program Files
Program Files (x86)
ProgramData
Recovery
System Volume Information
Users
Windows
bfMedia
hiberfil.sys
pagefile.sys
swapfile.sys
如果碰到类似的错误: Cannot run program "bash": CreateProcess error=2, 系统找不到指定的文件。
D:\sandbox\Java\jdk-17.0.2\bin\java.exe "-javaagent:D:\sandbox\JetBrains\IntelliJ IDEA Community Edition 2021.2.2\lib\idea_rt.jar=65187:D:\sandbox\JetBrains\IntelliJ IDEA Community Edition 2021.2.2\bin" -Dfile.encoding=UTF-8 -classpath D:\sandbox\code\bashrunner\target\classes;D:\sandbox\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;D:\sandbox\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;D:\sandbox\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar org.example.bashrunner.Main
Exception in thread "main" java.io.IOException: Cannot run program "bash": CreateProcess error=2, 系统找不到指定的文件。
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1143)
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1073)
at org.example.bashrunner.Main.main(Main.java:13)
Caused by: java.io.IOException: CreateProcess error=2, 系统找不到指定的文件。
at java.base/java.lang.ProcessImpl.create(Native Method)
at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:494)
at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:159)
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1110)
... 2 more
Process finished with exit code 1
需要把Git的路径加到环境变量Path
参考
https://www.baeldung.com/run-shell-command-in-java
https://mkyong.com/java/how-to-execute-shell-command-from-java/