如何在ProcessBuilder中运行长命令

时间:2018-11-19 14:36:45

标签: java terminal processbuilder

我正在尝试使用此命令:

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();

当我检查它时,该目录的路径应该是正确的(它在存储库的主目录中)。

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

1 个答案:

答案 0 :(得分:2)

反引号实际上是由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();
    }
}