在 Java 中使用 ProcessBuilder 读取输出 git-bash
Read output git-bash with ProcessBuilder in Java
我无法读取 git 命令的输出,我 运行 在 git bash 中 Java 使用 ProcessBuilder 的应用程序。
OS : Windows 8.1 --- IDE : IntelliJ
我的代码尝试列出 git 集线器存储库中的所有文件并计算 java 文件类型的数量。
完成git命令(管道类型):
cd C:/Users/Utente/Documents/Repository-SVN-Git/Bookkeeper && git ls-files | grep .java | wc -l
结果出现在我的 git bash 但它没有显示在我的 Java 应用程序中,我不明白为什么会这样。
Result in git-bash :
2140
Result in IntelliJ :
--- Command run successfully
--- Output=
这是我的 class java:
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();
}
}
}
---- 编辑 ----
我找到了一种获取 git-bash 输出的方法,方法是将它打印在一个 txt 文件中,然后从我的 java 应用程序中读取它。您可以在这里找到代码:
Open git bash using processBuilder and execute command in it
但是我仍然不明白为什么我无法使用 ProcessBuilder 读取输出
问题应该出在使用
C:/Program Files/Git/git-bash.exe
因为它会打开用户用于工作的 window,但是在 运行 时在 java 应用程序中您应该使用
C:/Program Files/Git/bin/bash.exe
这样 ProcessBuilder 可以读取 git 操作的结果。
ProcessBuilder 无法从 window git-bash.exe 中读取结果是正确的读数为空。如果您在 运行 时在 git-bash.exe 中执行 运行 命令,结果将仅显示在 window git-bash.exe 并且 java 应用程序无法读取它。
--- 编辑 2021/03/26 ---
总而言之,对于 运行 带有 git-bash 的命令并在 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
我无法读取 git 命令的输出,我 运行 在 git bash 中 Java 使用 ProcessBuilder 的应用程序。
OS : Windows 8.1 --- IDE : IntelliJ
我的代码尝试列出 git 集线器存储库中的所有文件并计算 java 文件类型的数量。
完成git命令(管道类型):
cd C:/Users/Utente/Documents/Repository-SVN-Git/Bookkeeper && git ls-files | grep .java | wc -l
结果出现在我的 git bash 但它没有显示在我的 Java 应用程序中,我不明白为什么会这样。
Result in git-bash :
2140
Result in IntelliJ :
--- Command run successfully
--- Output=
这是我的 class java:
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();
}
}
}
---- 编辑 ----
我找到了一种获取 git-bash 输出的方法,方法是将它打印在一个 txt 文件中,然后从我的 java 应用程序中读取它。您可以在这里找到代码:
Open git bash using processBuilder and execute command in it
但是我仍然不明白为什么我无法使用 ProcessBuilder 读取输出
问题应该出在使用
C:/Program Files/Git/git-bash.exe
因为它会打开用户用于工作的 window,但是在 运行 时在 java 应用程序中您应该使用
C:/Program Files/Git/bin/bash.exe
这样 ProcessBuilder 可以读取 git 操作的结果。
ProcessBuilder 无法从 window git-bash.exe 中读取结果是正确的读数为空。如果您在 运行 时在 git-bash.exe 中执行 运行 命令,结果将仅显示在 window git-bash.exe 并且 java 应用程序无法读取它。
--- 编辑 2021/03/26 ---
总而言之,对于 运行 带有 git-bash 的命令并在 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