通过bash和Java的ProcessBuilder api运行的相同命令获得不同的输出

问题描述 投票:0回答:1

所以我试图通过Java运行Git命令。我目前在Windows上安装了git bash界面和Java 8。

当我通过git bash运行此命令时:git --git-dir=PathToMyGitRepo log --pretty=format:'{"commit":"%H"},%n'我在此存储库中获得了所有日志的JSON格式输出,因此使解析变得容易。生成的JSON看起来像这样

{"commit":"SHA1"},
{"commit":"SHA2"}, 
...

因此,我将该命令移植到了我的Java应用程序中,并使用ProcessBuilder api运行了先前的命令。该命令运行时不会引发任何异常,但是我使用getInputStream方法获得的输出返回了类似的内容

'{commit:SHA1},''{commit:SHA2},'

这不是有效的JSON字符串。单引号保持不变,双引号被抛出,即使下一行字符有些丢失。

我尝试打印完全相同的命令,只是在ProcessBuilder之前运行它,然后自行运行。甚至通过bash和Java将命令的重定向输出输出到文件也可以提供不同的结果。

有人知道这里发生了什么吗?我怀疑Java会进行一些调整和扭曲以运行外部程序,但我不了解它如何影响所述程序的输出。

------------------------------------------------ - - - - - - - - -编辑 - - - - - - - - - - - - - - - - ----------------------------

因此,根据要求,这是我如何获取InputStream的代码的代码:

BufferedInputStream bis = null
try{
    List<String> gitCommand = new ArrayList<>(Arrays.asList("git", "--git-dir=PathToMyGitRepo", "log", "--pretty=format:'{\"commit\":\"%H\"},%n'"));
    Process p = new ProcessBuilder(gitCommand).start();
    bis = (BufferedInputStream) p.getInputStream();
    String buff = "";
    String JSON = "";
    BufferedReader reader = new BufferedReader(new InputStreamReader(bis));
    while((buff = bis.readLine())!=null){
        JSON += buff;
    }
    System.out.println(JSON);
}catch(IOException ex){
  ...
}

除了解析返回的JSON字符串外,我什么也不做。但是然后我得到了ParsingError: Unexpected character (') at position 1.。我将SimpleJSON库用于与JSON相关的内容。

java git stdout git-bash processbuilder
1个回答
0
投票

我的猜测是您没有正确转换它。 Java在下面运行一个shell,后者可以在执行命令之前去除引号。根据外壳的不同,它可能允许您转义引号。您可以通过在Java命令行中使用足够的反斜杠,"git...{\\\"command\\\"..."甚至更多的反斜杠或单引号和双引号的组合来保存它们。

为了使生活更轻松,更方便,我建议您忽略引号并将其放在结果中。例如,您可以传递其他符号:--pretty=format:'{=commit=:=%H=},%n,然后只需运行result.replaceAll("=","\"");或其他

© www.soinside.com 2019 - 2024. All rights reserved.