Хотите вызвать команду linux shell из Java

Я пытаюсь выполнить некоторые команды Linux из Java, используя redirection (> &) и pipe (|). Как Java может вызывать команды csh или bash ?

Я попытался использовать это:

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

Но он несовместим с redirectм или трубами.

exec не выполняет команду в вашей оболочке

пытаться

 Process p = Runtime.getRuntime().exec(new String[]{"csh","-c","cat /home/narek/pk.txt"}); 

вместо.

EDIT :: У меня нет csh в моей системе, поэтому я использовал bash вместо этого. Следующие работали для меня

 Process p = Runtime.getRuntime().exec(new String[]{"bash","-c","ls /home/XXX"}); 

Используйте ProcessBuilder для разделения команд и аргументов вместо пробелов. Это должно работать независимо от используемой оболочки:

 import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class Test { public static void main(final String[] args) throws IOException, InterruptedException { //Build command List commands = new ArrayList(); commands.add("/bin/cat"); //Add arguments commands.add("/home/narek/pk.txt"); System.out.println(commands); //Run macro on target ProcessBuilder pb = new ProcessBuilder(commands); pb.directory(new File("/home/narek")); pb.redirectErrorStream(true); Process process = pb.start(); //Read output StringBuilder out = new StringBuilder(); BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); String line = null, previous = null; while ((line = br.readLine()) != null) if (!line.equals(previous)) { previous = line; out.append(line).append('\n'); System.out.println(line); } //Check result if (process.waitFor() == 0) { System.out.println("Success!"); System.exit(0); } //Abnormal termination: Log command parameters and output and throw ExecutionException System.err.println(commands); System.err.println(out.toString()); System.exit(1); } } 

Основываясь на примере Тима, чтобы сделать автономный метод:

 import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader; import java.util.ArrayList; public class Shell { /** Returns null if it failed for some reason. */ public static ArrayList command(final String cmdline, final String directory) { try { Process process = new ProcessBuilder(new String[] {"bash", "-c", cmdline}) .redirectErrorStream(true) .directory(new File(directory)) .start(); ArrayList output = new ArrayList(); BufferedReader br = new BufferedReader( new InputStreamReader(process.getInputStream())); String line = null; while ( (line = br.readLine()) != null ) output.add(line); //There should really be a timeout here. if (0 != process.waitFor()) return null; return output; } catch (Exception e) { //Warning: doing this is no good in high quality applications. //Instead, present appropriate error messages to the user. //But it's perfectly fine for prototyping. return null; } } public static void main(String[] args) { test("which bash"); test("find . -type f -printf '%T@\\\\t%p\\\\n' " + "| sort -n | cut -f 2- | " + "sed -e 's/ /\\\\\\\\ /g' | xargs ls -halt"); } static void test(String cmdline) { ArrayList output = command(cmdline, "."); if (null == output) System.out.println("\n\n\t\tCOMMAND FAILED: " + cmdline); else for (String line : output) System.out.println(line); } } 

(Пример теста – это команда, которая перечисляет все файлы в каталоге и его подкаталогах, рекурсивно, в хронологическом порядке .)

Кстати, если кто-нибудь скажет мне, почему мне нужны четыре и восемь обратных косых черт, вместо двух и четырех я могу чему-то научиться. Существует еще один уровень неудачи, чем то, что я считаю.

Редактировать: просто попробовал этот же код в Linux, и там выясняется, что мне нужно вдвое меньше обратных косых черт в тестовой команде! (То есть: ожидаемое число два и четыре.) Теперь это уже не просто странно, это проблема переносимости.

  • Запустить командную строку в качестве администратора
  • Вход с клавиатуры в приложении командной строки
  • Изменение каталога запуска по умолчанию для командной строки в Windows 7
  • Как выполнить: выполнить командную строку на C #, получить результаты STD OUT
  • Как отправить ctrl + c процессу в c #?
  • Как запустить SQL-скрипт в MySQL?
  • Использование Java ProcessBuilder для выполнения команды Piped
  • Отладка с параметрами командной строки в Visual Studio
  • Способ запуска макросов Excel из командной строки или командного файла?
  • Лучший анализатор CLI для Java
  • Что означает cmd / C?
  • Interesting Posts
    Давайте будем гением компьютера.