Как запустить длинную команду в ProcessBuilder - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь использовать эту команду:

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 голосов
/ 19 ноября 2018

Обратные тики фактически обрабатываются оболочкой unix - 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();
    }
}
...