当前位置: 首页 > 知识库问答 >
问题:

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

李开宇
2023-03-14

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

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

因此,我将该命令移植到Java应用程序中,并使用ProcessBuilderapi运行前面的命令。该命令运行时没有引发任何异常,但我使用getInputStream方法获得的输出返回如下所示

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

它不是有效的JSON字符串。单引号很好,双引号被抛出,甚至下一行字符也会丢失一些。

我尝试打印完全相同的命令,只是befroreprocessBuilder运行它,然后我自己运行它。即使是通过bash和Java将命令重定向到文件的输出也提供了不同的结果。

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){
  ...
}

共有1个答案

彭高畅
2023-03-14

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

为了让生活变得便携和容易,我建议忘记引用,把它们放在结果中。例如,您可以传递一些其他符号:--pretty=format:'{=commit=:=%h=},%n,然后只需运行result.replaceAll(“=”,“\”“);或其他

 类似资料:
  • 我正在用自己的参数从JAR3程序中启动。第一个和第二个程序完成它们的工作,但第二个程序不完成。 这个程序之后的第三个程序也有效。我不明白为什么。

  • 输出如下:http://imgur.com/a/nu3n6

  • 问题内容: 我发现了几个用于通过Java类运行cmd命令的代码段,但我无法理解。 这是打开cmd的代码 我找到了一些其他链接来添加其他命令,例如cd http://www.coderanch.com/t/109753/Linux-UNIX/exec-command-cd-command-java 如何使用Java打开命令提示符并插入命令? 谁能帮助我了解如何CD目录,例如: 然后在该目录上运行其他

  • 我找到了几个通过Java类运行cmd命令的代码片段,但我无法理解。 这是打开命令的代码 我还找到了一些添加其他命令的链接,比如cdhttp://www.coderanch.com/t/109753/Linux-UNIX/exec-command-cd-command-java 如何使用Java打开命令提示符并插入命令? 有人能帮我了解如何cd目录,例如: 然后在该目录上运行其他命令?

  • 我遇到了麻烦,对php shell_exec命令感到非常困惑。当命令由PHP执行时,我没有错误,但执行失败。如果我从终端使用完全相同的命令,它就会工作。 命令如下: 当我从终端发来这个: 但是从我的php脚本: 我已经测试了shell_exec的输出,它是空的。 日志: /tmp目录中没有权限pb: 我尝试了avec PHP exec()函数来获取错误信息,我只是在return_var中得到一个“

  • 我对SWT有点新手,对Java和Eclipse基本上已经生疏了。我一直在写一个简单的应用程序来恢复心态(这实际上是我孙女的算术事实测验程序)。我正在使用SWT作为可可/osx/x86_64平台。最终目标是将应用程序打包成OS X。应用程序捆绑包。 这就是我摔倒和爬不起来的地方:从Eclipse IDE内部执行时,它工作正常,使用java命令行从交互式bash外壳独立执行时,它也工作正常,但是从外壳