#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");
Вы также можете использовать вместо этого список < Строка> .