如何用Java运行bash命令

在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/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值