Java ProcessBuilder + bash: «Нет такого файла или каталога» - PullRequest
0 голосов
/ 06 июля 2019

Я пытаюсь запустить bash из Java в Windows (здесь с подсистемой Windows Linux, но Git Bash - то же самое), но даже основы не работают:

bash --noprofile --norc -c 'echo $PWD'`

В cmd.exe это прекрасно работает:

Works fine in CMD.exe

В Java:

import static java.util.stream.Collectors.joining;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UncheckedIOException;
import java.util.ArrayList;
import java.util.List;

public class ProcessBuilderTest {
    public static int runBatch() {
        List<String> commandLine = new ArrayList<>();
        // both following lines have the same result
        commandLine.add("bash");
        // commandLine.add("C:\\Windows\\System32\\bash.exe"); 

        commandLine.add("--noprofile");
        commandLine.add("--norc");
        commandLine.add("-c");
        commandLine.add("'echo $PWD'");

        System.out.println("cmd: " + commandLine.stream().collect(joining(" ")));
        try {
            ProcessBuilder processBuilder = new ProcessBuilder(commandLine);
            Process process = processBuilder
                .redirectErrorStream(true)
                .start();
            new BufferedReader(new InputStreamReader(process.getInputStream())).lines()
                .forEach(System.out::println);
            return process.waitFor();
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        } catch (InterruptedException e) { // NOSONAR
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
        runBatch();
    }
}

Выполнение вышеуказанного приводит к следующему, и процесс никогда не завершается.

cmd: bash --noprofile --norc -c 'echo $PWD'
/bin/bash: echo /mnt/c/scratch/pbtest: No such file or directory

Ожидаемое поведение: ошибка отсутствует, и процесс завершается.

Ответы [ 2 ]

1 голос
/ 06 июля 2019

Использование Git-bash: я изменил эти две строки и запустил, как и ожидалось:

// Used full path to the underlying bash.exe shell
commandLine.add("\"C:\\Program Files\\Git\\bin\\bash.exe\"");

// Removed quotes
commandLine.add("echo $PWD"); 

Ref: https://superuser.com/a/1321240/795145

1 голос
/ 06 июля 2019

bash работает в cmd.exe в вашей среде Windows

Не могли бы вы вместо Java запустить следующую команду?

cmd.exe /c bash --noprofile --norc -c 'echo $PWD'

ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe", 
    "/c", 
    "bash --noprofile --norc -c 'echo $PWD'");

или со списком, как вы изначально пытались

Вдохновленный Mkyong Post

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...