Как передать аргументы сценарию оболочки с использованием Java?

#java #shell

#java #оболочка

Вопрос:

Я написал код, который вызывает сценарий оболочки:

  ProcessBuilder pb2=new ProcessBuilder("/home/abhijeet/sample1.sh");
 Process script_exec = pb2.start();
 pb2.redirectError();
 

Код работает для меня, поскольку он выполняет скрипт.

Этот скрипт принимает два аргумента 1: входной файл 2: seqs , в шаблоне, подобном:

  sample1.sh -ip=abc.txt --seqs=20
 

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

db = формат вывода abc = 1 потоков = 10 sample1.sh -ip=abc.txt —seqs=20

Итак, как я могу выполнить этот скрипт с использованием Java? Есть ли другой способ вызвать интерактивный скрипт с использованием Java?

Ответ №1:

Вы можете попробовать это:

  ProcessBuilder pb2=new ProcessBuilder("/home/abhijeet/sample1.sh --ip=abc.txt --seqs=20");
 Process script_exec = pb2.start();
 OutputStream in = script_exec.getOutputStream();
 in.write("abc".getBytes());
 in.write("1".getBytes());
 in.write("10".getBytes());
 in.flush();
 in.close();
 

Этот код записывает abc, 1 и 10 для обработки ввода.

Комментарии:

1. Это код для интерактивного скрипта? Я подумал, что это может быть сложно, поэтому я изменил сценарий и хочу напрямую установить эти значения в качестве аргумента.

2. Когда вы вызываете интерактивную программу, она ожидает ввода пользователем. in.write(«abc».getBytes()); in.write(«1».getBytes()); in.write(«10».getBytes()); записывает значения так, как это сделал бы пользователь.

3. вывод БД и потоки передаются этим, но —ip и —seqs по-прежнему не работают. Должен ли я изменить свой скрипт и принять эти значения также в качестве этих аргументов?

4. Как я понимаю, —ip и —seqs — это не пользовательские данные, а параметры программы. В таком случае вам нужно добавить их в команду или передать в качестве аргументов, как написал fmcato.

5. Застрял в точке, что если этот интерактивный скрипт длинный, и он принимает ввод где-то посередине, то как я могу узнать, используя inputstream, что скрипт запрашивает пользовательский ввод?

Ответ №2:

Я рекомендую использовать Apache Commons Exec, это помогает запускать внешние процессы в многоплатформенной среде.

Вот руководство: http://commons.apache.org/proper/commons-exec/tutorial.html

Ответ №3:

Просто передайте аргументы в конструкторе ProcessBuilder. Вот так:

 ProcessBuilder pb2=new ProcessBuilder("/home/abhijeet/sample1.sh", "-ip=abc.txt", "--seqs=20");
 

Вы также можете использовать вместо этого список < Строка> .