Невозможно запустить сценарий оболочки - PullRequest
1 голос
/ 21 ноября 2011

Я пытаюсь запустить скрипт оболочки из моей ОС Windows, используя Cygwin.Когда я бегу из командной строки, он работает нормально, как я понимаю C: \ cygwin \ bin и Run sh my_script.sh .

Когда я пытаюсь это черезкод получает следующую ошибку

C:\Java\jdk1.6\bin>java CmdProcessBuilder
Exception in thread "main" java.io.IOException: Cannot run program "C:\cygwin\bi
n\my_script.sh": CreateProcess error=193, %1 is not a valid Win32 application
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:459)
        at CmdProcessBuilder.main(CmdProcessBuilder.java:13)
Caused by: java.io.IOException: CreateProcess error=193, %1 is not a valid Win32
 application
        at java.lang.ProcessImpl.create(Native Method)
        at java.lang.ProcessImpl.<init>(ProcessImpl.java:81)
        at java.lang.ProcessImpl.start(ProcessImpl.java:30)
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:452)
        ... 1 more

Ниже приведен код:

public static void main(String args[])
     throws InterruptedException,IOException
  {
    List<String> command = new ArrayList<String>();
    command.add(System.getenv("cygwin") +"\\bin\\"+"sh my_script.sh");

    ProcessBuilder builder = new ProcessBuilder(command);

    final Process process = builder.start();
    InputStream is = process.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    String line;
    while ((line = br.readLine()) != null) {
      System.out.println(line);
    }
    System.out.println("Program terminated!");
  }

Когда я пытаюсь cd cygwin \ bin \ sh my_script.sh из командной строкине выполняется выдача сообщения msg Системе не удается найти указанный путь.

Ответы [ 3 ]

1 голос
/ 21 ноября 2011

Возможно, вам повезет больше, если использовать Runtime.exec, например:

String fs = System.getProperty("file.separator");
String command = System.getenv("cygwin") + fs + "bin" + fs + "sh my_script.sh";

Process p = Runtime.getRuntime().exec(command);

Рекомендуется также избегать использования зависимых от платформы строк в ваших путях.

0 голосов
/ 21 ноября 2011

Одна вещь, которую я отмечаю о вашей конструкции, это то, что вы, возможно, неправильно строите командную строку.Читая документы ProcessBuilder (ранее они не использовались), вы строите команду процесса со списком строк, как вы это делаете, но первая строка - это команда, остальные - аргументы.Способ создания команды:

List<String> command = new ArrayList<String>();
command.add(System.getenv("cygwin") + fs + "bin" + fs + "sh " + "my_script.sh"); 

ProcessBuilder builder = new ProcessBuilder(command);

появляется для создания имени команды, которое включает имя сценария.Измените вызов на:

List<String> command = new ArrayList<String>();
command.add(System.getenv("cygwin") + fs + "bin" + fs + "sh ");
command.add("my_script.sh"); 

ProcessBuilder builder = new ProcessBuilder(command);

и проверьте ошибку.Затем проверьте, не обнаружена ли проблема, связанная с тем, что c: \ cygwin \ bin \ sh.exe не найден или сам скрипт не найден.Вы упоминаете, что пытались безуспешно выполнить cd , так где же находится сценарий my_script.sh относительно файлов классов java?Когда вы вызываете команду sh , возможно, не удастся найти файл my_script.sh , поскольку рабочий каталог может оказаться не там, где вы думаете.

Oneвы можете попытаться определить, где sh.exe считает, что он работает.Из вашего Java-кода вы сможете вызывать оболочку следующим образом:

  List<String> command = new ArrayList<String>();
  String fs = System.getProperty("file.separator");
  command.add(System.getenv("cygwin") + fs + "bin" + fs + "sh");
  command.add("-c");
  command.add("pwd"); 

Вывод этого должен быть каталогом, из которого команда оболочки считает, что она выполняется.Если это не то место, где находится фактический my_script.sh , вам может потребоваться полный путь к самому сценарию (в качестве примера пути в формате cygwin)

  command.add(System.getenv("cygwin") + fs + "bin" + fs + "sh");
  command.add("/usr/local/scripts/my_script.sh");

Этоэто то место, где я бы начал отлаживать.

0 голосов
/ 21 ноября 2011

Вы пытались заменить вашу команду на

./cygdrive/c/cygwin/bin/my_script.sh

? Если вы хотите перейти от того, что у вас есть, вам, вероятно, нужно заменить вашу команду на

command.add(System.getenv("cygwin") +"\\\\bin\\\\"+"sh my_script.sh");

выполнить

  C:\cygwin\\bin\\my_script.sh  

, как в Cygwin используются пути в стиле Windows.

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