Получение ошибки при вызове сценария оболочки в среде Windows с использованием кода Java и Cygwin ...! - PullRequest
0 голосов
/ 24 марта 2012

Я хочу вызвать сценарий оболочки в среде Windows, используя код Java.Я пытаюсь выполнить приведенный ниже код для запуска моего тестового сценария (не фактического сценария):

Java-код:

public static void main (String args[]) {
        Runtime r = Runtime.getRuntime();
        try {
            Process p = r.exec("C:\\cygwin\\bin\\bash -c '/cygdrive/d/scripts/test.sh'");
            InputStream in = p.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            System.out.println("OUT:");
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }

            in = p.getErrorStream();
            br = new BufferedReader(new InputStreamReader(in));
            System.out.println("ERR:");
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }

            p.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

test.sh

#!/bin/bash

rm -rf ./test

Но я получаю эти ошибки и скрипт не может удалить каталог.

ERR: / cygdrive / d / ereader / scripts / test.sh: строка 2: $ '\ r': команда не найдена /cygdrive/d/ereader/scripts/test.sh: строка 3: rm: команда не найдена

Другое дело, когда язапустить скрипт из терминала cygwin, он работает нормально.Я проверил переменную пути они все в порядке.Но я пытаюсь выполнить тот же скрипт через код Java, он выдает ошибку ..

Теперь, как указать программе Java, куда обращаться за командами rm?

Ответы [ 3 ]

3 голосов
/ 24 марта 2012

Дешевая распродажа - ошибка '\ r'.

Windows и Unix (включая Mac и Linux) используют разные представления новой строки. Windows использует «\ r \ n», а Unix просто использует «\ n». Большинство редакторов программ учитывают это и вставляют только '\ n', поэтому они работают с инструментами Unix.

Я бы предложил переписать ваш скрипт оболочки в другом редакторе, таком как Notepad ++ (который вставляет только '\ n'), или убедиться, что ваш текущий редактор настроен на использование новых строк Unix. Вы должны перепечатать его, иначе будут скопированы плохие последовательности '\ r \ n'. Возможно, вам повезет в замене всего, но для меня это всегда плохо.

1 голос
/ 24 марта 2012

Не совсем ответ.Вы можете попробовать следовать, чтобы сузить проблему

  1. Использовать ProcessBuilder вместо Process.Гораздо удобнее обрабатывать аргументы.
  2. Установить абсолютный путь к rm (/ bin / rm) в скриптеdirectory ..

Ваше приглашение bash является результатом вызова cygwin.bat bash с параметром --login.Он будет иметь переменные пути и другие источники ресурсов.bash -c этого не делает.

  1. Попробуйте запустить bash.exe с помощью bash -l -c <command>: это источник профиля bash.
1 голос
/ 24 марта 2012

вероятно, вам нужно будет сначала установить переменную PATH в скрипте test.sh.Убедитесь, что rm находится в ПУТИ, который вы установили

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