【问题标题】:How to run long command in ProcessBuilder如何在 ProcessBuilder 中运行长命令
【发布时间】:2019-04-21 22:42:17
【问题描述】:

我正在尝试使用这个命令:

git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`

我正在通过 ProcessBuilder 运行。现在,我知道我的其余代码可以正常工作,因为我已经用其他示例对其进行了测试。但我不确定如何拆分此命令以使其适用于 ProcessBuilder。

显然,这个方法不起作用:

String[] command = {"git", "checkout", "`git rev-list -n 1 --before=\"2014-01-01 12:00\" master`"};

这也不起作用:

String[] command = {"git", "checkout", "`git", "rev-list", "-n", "1", "--before=\"2014-01-01 12:00\"", "master`"};

我也没有从控制台获得任何输出(我使用 InputStream),这意味着我更难找出问题所在。我认为这个问题对于熟悉 ProcessBuilders 的人来说应该是显而易见的,所以是的......

我的其余代码如下所示:

ProcessBuilder processBuilder = new ProcessBuilder(command);
processBuilder.directory(new File(fullPath));
process = processBuilder.start();

并且我检查过的目录路径应该是正确的(它在存储库的主目录中)。

如果我需要提供代码的其他部分,我会提供。

【问题讨论】:

  • 快速回答是您需要先运行git rev-list... 命令,使用ProcessBuilder 捕获其输出并将其作为参数传递给您的git checkout 命令。我会跟进一个很长的答案:)
  • 谢谢,它有效!一旦你写下来,我仍然会阅读你的完整回复。我需要弄清楚如何连续两次使用 ProcessBuilder。
  • 反引号只能被 bash 这样的 shell 理解。 Java(如 C)直接运行命令,不使用任何 shell,因此反引号(以及所有其他引号,以及重定向符号)在任何方面都没有特殊。
  • 不,我有一个稍微不同的问题。在另一篇文章中,我的问题是 ProcessBuilder 或我使用的命令不喜欢字符串末尾的额外空格。在这篇文章中,我问的是如何在 ProcessBuilder 中使用循环 git 函数。由于我是 StackOverflow 社区的新手,因此我不会删除我的帖子,以防有人遇到类似问题。但是,如果这意味着人们会查看我的帖子来回答他们,那么我可能应该删除已解决的案例,以免引起额外的关注并浪费某人的时间。

标签: java terminal processbuilder


【解决方案1】:

反引号实际上是由 unix shell 处理的——Java 不处理它们。使用流程构建器时,您应该执行反引号中给出的命令并将输出作为参数传递给第二个命令。下面是一个简单的例子:(使用'ls')。

import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.io.IOUtils;

public class ProcessBuilderTest {

    public static void main(String[] args) throws IOException, InterruptedException {
        // Command: ls `ls /etc/passwd /etc/services`

        // Read the output from the command second ls...
        ProcessBuilder pb = new ProcessBuilder("ls", "/etc/passwd", "/etc/services");
        Process process = pb.start();
        InputStream is = process.getInputStream();
        List<String> lines = IOUtils.readLines(is, Charset.defaultCharset());

        ArrayList<String> cmdParts = new ArrayList<>();
        cmdParts.add("ls");
        cmdParts.addAll(lines);

        // Construct the second command
        ProcessBuilder pbLs = new ProcessBuilder(cmdParts);
        Process lsProcess = pbLs.start();
        System.out.println(IOUtils.readLines(lsProcess.getInputStream(), Charset.defaultCharset()));
        lsProcess.waitFor();
    }
}

【讨论】:

  • 使用String[] command = {"bash", "-c", "git checkout `git rev-list -n 1 --before=\"2014-01-01 12:00\" master`"};会更方便吗?或者这种方法与您提出的方法相比有什么缺点吗?
  • 只有几个问题。 1.一旦你使用它或多或少只有Unix 2.一个额外的进程。否则就OK了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2018-11-19
相关资源
最近更新 更多