当前位置: 首页 > 知识库问答 >
问题:

用Java中的ProcessBuilder读取输出git-bash

公冶俊达
2023-03-14

在使用ProcessBuilder的Java应用程序中,我无法读取在git bash中运行的git命令的输出。

OS:Windows 8.1---IDE:IntelliJ

cd C:/Users/Utente/Documents/Repository-SVN-Git/Bookkeeper && git ls-files | grep .java | wc -l
Result in git-bash :
 2140
Result in IntelliJ :
 --- Command run successfully
 --- Output=
public class SelectMetrics {

public static final String path_bash = "C:/Program Files/Git/git-bash.exe";    
public static final String path_repository = "cd C:/Users/Utente/Documents/Bookkeeper";        
public static final String git_command = "git ls-files | grep .java | wc -l";        
public static final String command_pipe = path_repository + " && " + git_command;

public static void main(String[] args) {       
    runCommandPIPE(command_pipe);
}

public static void runCommandPIPE(String command) {
    try {
        ProcessBuilder processBuilder = new ProcessBuilder();
        processBuilder.command(path_bash, "-c", command);

        Process process = processBuilder.start();
        StringBuilder output = new StringBuilder();
        BufferedReader reader = new BufferedReader(
          new InputStreamReader(process.getInputStream()));

        String line;
        while ((line = reader.readLine()) != null) {
            output.append(line + "\n");
        }
        int exitVal = process.waitFor();
        if (exitVal == 0) {
            System.out.println(" --- Command run successfully");
            System.out.println(" --- Output=" + output);
        } else {
            System.out.println(" --- Command run unsuccessfully");
        }
    } catch (IOException | InterruptedException e) {
        System.out.println(" --- Interruption in RunCommand: " + e);
        // Restore interrupted state
        Thread.currentThread().interrupt();
    }
}
  
}

使用processBuilder打开git bash并在其中执行命令

但是,我仍然不明白为什么不能用ProcessBuilder读取输出

共有1个答案

花飞扬
2023-03-14

问题应该在使用

C:/Program Files/Git/git-bash.exe

因为它打开了用户用于工作的窗口,但在java应用程序的运行时,您应该使用

C:/Program Files/Git/bin/bash.exe

这样,ProcessBuilder就可以读取git操作的结果。

ProcessBuilder无法从git-bash.exe窗口读取,正确的做法是读取的结果为NULL。如果在运行时在git-bash.exe中运行命令,结果将只显示在窗口git-bash.exe中,java应用程序无法读取它。

public static final String path_bash = "C:/Program Files/Git/bin/bash.exe";

然后

Result in git-bash :
2183
Result in IntelliJ :
 --- Command run successfully
 --- Output=2183
 类似资料:
  • 我想用java代码调用一个外部程序,然后Google告诉我Runtime或ProcessBuilder可以帮助我完成这项工作。我试过了,结果发现java程序无法退出,这意味着子进程和父进程都将永远等待。它们要么挂起,要么陷入僵局。 有人告诉我原因是子进程的缓存太小了。当它试图将数据返回给父进程时,但是父进程没有及时读取它,然后他们两个都挂起了。所以他们建议我叉一个线程来负责读取子进程的缓存数据。我

  • 我想在提取一些数据时使用外部工具(循环通过行)。为此,我首先使用了Runtime.getRuntime()。exec()执行它。但后来我的提取变得很慢。所以我在寻找一种可能性,在循环的每个实例中,使用shell的同一个实例来执行外部工具。 我发现,我应该使用ProcessBuilder。但是现在还不行。 这是我测试执行的代码(已经从论坛中的答案输入): 我想在另一个类中调用它,例如 Testcla

  • 问题内容: 我正在Ubuntu 11.4上的一个终端上运行它。 假设我执行一个bash脚本,输出为: 在同一个bash脚本中,如何将上述输出存储为一个或多个变量? 理想的解决方案是准备好在以下条件中使用:(输出的第一行将存储在等中) 问题答案: 所以你要 请参见Bash手册中的“此处字符串” 。 或流程替代

  • 问题内容: 我有一个Java应用程序,该应用程序存在一些性能问题,有人建议我以verbose:gc模式运行它。这已经完成,但是我不知道如何解释日志记录。是否可以向我解释这一切的含义,或者为我提供提高性能的建议? 可以在以下位置找到输出日志:http : //pastebin.com/uDNPEGcd 在此先感谢您,马尔滕 问题答案: 在每个gc集合之后立即打印,并打印有关每个世代内存详细信息的详细

  • 问题内容: 我正在尝试使用以下代码重定向在ProcessBuilder的帮助下启动的流程的输出 但是它以失败告终 线程“主”中的异常java.io.IOException:无法运行程序“ / myScript >> / myLogFile 2>&1 <&-&”:java.io.IOException:error = 2,java.lang中没有此类文件或目录.ProcessBuilder.star