通过bash和Java运行相同的命令';的ProcessBuilderAPI获得不同的输出

通过bash和Java运行相同的命令';的ProcessBuilderAPI获得不同的输出,java,git,stdout,git-bash,processbuilder,Java,Git,Stdout,Git Bash,Processbuilder,所以我试图通过java运行Git命令。我目前在安装了git bash接口和Java 8的Windows上 当我通过git bash运行这个命令时:git--git dir=PathToMyGitRepo log--pretty=format:“{”commit:“%H”},%n'我得到了这个存储库中所有日志的JSON格式的输出,从而简化了解析。生成的JSON如下所示 {"commit":"SHA1"}, {"commit":"SHA2"}, ... '{commit:SHA1},''{com

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

当我通过git bash运行这个命令时:
git--git dir=PathToMyGitRepo log--pretty=format:“{”commit:“%H”},%n'
我得到了这个存储库中所有日志的JSON格式的输出,从而简化了解析。生成的JSON如下所示

{"commit":"SHA1"},
{"commit":"SHA2"}, 
...
'{commit:SHA1},''{commit:SHA2},'
因此,我将该命令移植到我的Java应用程序中,并使用ProcessBuilderAPI运行前面的命令。该命令在运行时不会引发任何异常,但是我使用getInputStream方法得到的输出返回如下内容

{"commit":"SHA1"},
{"commit":"SHA2"}, 
...
'{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){
  ...
}
BufferedInputStream bis=null
试一试{
List gitCommand=newarraylist(Arrays.asList(“git”,“--git dir=PathToMyGitRepo”,“log”,“--pretty=format:”{\“commit\”:\%H\”},%n');
Process p=新的ProcessBuilder(gitCommand).start();
bis=(BufferedInputStream)p.getInputStream();
字符串buff=“”;
字符串JSON=“”;
BufferedReader reader=新的BufferedReader(新的InputStreamReader(bis));
而((buff=bis.readLine())!=null){
JSON+=buff;
}
System.out.println(JSON);
}捕获(IOEX异常){
...
}

除了解析返回的
JSON
字符串,我什么都不做。但随后我在位置1处得到了一个
ParsingError:意外字符(')。
。我正在使用SimpleJSON库处理与JSON相关的内容。

我猜您没有正确地转换它。Java在下面运行一个shell,后者可以在执行命令之前去掉引号。根据shell的不同,它可能允许您转义引号。您可以在java命令行中使用足够的反斜杠来保存它们,类似于“
”git…{\\\\”command\\\“…”
或者更多的反斜杠,或者单引号和双引号的组合


为了使生活更方便,我建议忘记引号并将它们放在结果中。例如,您可以传递一些其他符号:
--pretty=format:“{=commit=:=%H=},%n
,然后运行
result.replaceAll(“=”,“\”)
或其他东西

在这里发布您的代码会有所帮助…您如何获得
输入流
,是否使用
读取器
类型类将其包装?我尝试了单引号技术,但结果保持不变。对于您的解决方案,这似乎有点像是一种黑客方式…我喜欢它!我将返回给您如果没有其他办法的话,我会告诉你这项技术。