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

标签 java git stdout git-bash processbuilder

所以我尝试通过 java 运行 Git 命令。我目前使用的是 Windows,安装了 git bash 界面和 Java 8。

当我通过 git bash 运行此命令时: git --git-dir=PathToMyGitRepo log --pretty=format:'{"commit":"%H"},%n' I获取此存储库上所有日志的 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 (') atposition 1.。我正在使用 SimpleJSON 库来处理与 JSON 相关的内容。

最佳答案

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

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

关于java - 通过 bash 和 Java 的 ProcessBuilder api 运行相同的命令会得到不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58217134/

相关文章:

git - .gitignore 语法 : bin vs bin/vs. bin/* 与 bin/**

Git 命令失败 HttpRequestException

与子进程的标准输入/标准输出异步通信

java - 如何整合Spring Boot、Camel和Mybatis

java - 不同实现的相同单元测试

GitLab 请求的 URL 返回错误 : 503

node.js - AWS环境下如何查看stdout?

c++ - 是否应该将 GUI 应用程序警告消息发送到 std::cerr?

java - 关于Java Eclipse导出功能的问题

java - 如何从存储在服务器上的表中检索列值?