2015-12-15 7 views
0

Я пытаюсь запустить команду оболочки в linux через java. большинство команд работают, но когда я запускаю следующую команду я получаю execption, хотя она работает в оболочке:Почему следующий код не работает?

String command = "cat b.jpg f1.zip > pic2.jpg"; 

    String s = null; 
    try { 
     Process p = Runtime.getRuntime().exec(command); 

     BufferedReader stdInput = new BufferedReader(new 
      InputStreamReader(p.getInputStream())); 

     BufferedReader stdError = new BufferedReader(new 
      InputStreamReader(p.getErrorStream())); 

     System.out.println("Here is the standard output of the command:\n"); 

     while ((s = stdInput.readLine()) != null) { 
      System.out.println(s); 
     } 
     System.out.println("Here is the standard error of the command (if any):\n"); 
     while ((s = stdError.readLine()) != null) { 
      System.out.println(s); 
     } 
     System.exit(0); 
    } 
    catch (IOException e) { 
     System.out.println("exception happened - here's what I know: "); 
     e.printStackTrace(); 
     System.exit(-1); 
    } 

я получаю сообщение об ошибке в консоли:

кошачьих:>: Нет такой файл или каталог

кошка: pic2.jpg: Нет такого файла или каталога

+4

Я думаю, что это может быть связано - http://stackoverflow.com/questions/16238714/runtimes-exec-method-is-not-redirecting-the -вывод –

ответ

1

Потому что вам нужно запустить оболочку (например,/bin/Баш), который будет выполнять ваши команды оболочки, замените:

String command = "cat b.jpg f1.zip > pic2.jpg"; 

с

String command = "bash -c 'cat b.jpg f1.zip > pic2.jpg'"; 
1

При выполнении команды не запускает оболочку, как Баш, если вы не сделаете это в явном виде. Это означает, что вы используете cat с четырьмя аргументами b.jpgf1.zip>pic2.jpg Последние два имени файла не существуют, поэтому вы получаете сообщение об ошибке.

Возможно, вы планировали следующее.

String command = "sh -c 'cat b.jpg f1.zip > pic2.jpg'"; 

Это будет работать sh который в > видит как специальный символ, который перенаправляет вывод.

2

Проблема в перенаправлении.

кошка>: Нет такого файла или каталога

Путь интерпретировать это сообщение об ошибке:

  • программа cat пытается рассказать вам о проблеме
  • в проблема заключается в том, что нет файла с именем >

Действительно, > не является файлом. Это вообще не предназначено как файл. Оператор оболочки перенаправляет вывод.

Вы должны использовать ProcessBuilder для перенаправления:

ProcessBuilder builder = new ProcessBuilder("cat", "b.jpg", "f1.zip"); 
builder.redirectOutput(new File("pic2.jpg")); 
Process p = builder.start(); 
Смежные вопросы