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

Same command run via bash and Java's ProcessBuilder api gets different output

所以我正在尝试通过 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 方法得到的输出 return 是这样的

'{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.。我正在为我的 JSON 相关内容使用 SimpleJSON 库。

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

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