【问题标题】:Same command run via bash and Java's ProcessBuilder api gets different output相同的命令通过 bash 运行,Java 的 ProcessBuilder api 得到不同的输出
【发布时间】:2020-02-01 15:43:11
【问题描述】:

所以我正在尝试通过 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"}, 
...

然后我将命令移植到我的 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 相关内容。

【问题讨论】:

  • 在这里发布您的代码会有所帮助...您如何获得InputStream,您是否使用Reader 类型类包装它?

标签: java git stdout git-bash processbuilder


【解决方案1】:

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

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

【讨论】:

  • 我尝试了单引号技术,但结果保持不变。对于您的解决方案,这似乎有点笨拙……我喜欢它!如果没有其他方法,我会向您介绍这项技术。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多