Сделать java-приложение для возврата к вызову оболочки script
Гуру Unix!
У меня есть Java-программа, которая передает некоторые параметры Servlet. Сервлет вводит информацию в БД и возвращает обратно идентификатор строки, созданной обратно в программу java, которая ее вызывает. Java-программа запускается в Unix оболочке script, которая позже вызывается другой java-программой Java Program_2 (скажем).
Моя проблема заключается в следующем: мне нужно передать идентификатор, который мы получаем из Java Program, в качестве параметра Java Program_2 в той же оболочке script. Есть ли какая-нибудь лучшая практика для этого?
Вещи, с которыми я работаю до сих пор -
1) Сделайте java-программу для возврата кода выхода с помощью System.exit()
. 2 вопроса с этим - Как мне уловить код выхода в переменной в оболочке? Правильно ли это сделать? Код выхода фактически предназначен для возврата параметра успеха программы...
2) Запишите вывод в файл java Java_Program >opt.txt
. Если я это сделаю, то , как я снова прочитаю содержимое opt.txt
в переменной оболочки?
Спасибо большое!
Изменить: Я должен был упомянуть об этом до того, как на самом деле... программы находятся на разных машинах. я ssh в другую машину, используя script.., а затем запустите java-программу 2. Следовательно, я не могу передать два файла.
Ответы
Ответ 1
Я бы не рекомендовал использовать статус выхода для переноса данных по причинам, которые вы указали. Захват статуса выхода зависит от того, какую оболочку вы используете, но в Bash специальная переменная $?
содержит статус выхода последнего выполненного процесса.
Запись данных в stdout гораздо более идиоматична. В Bash вы записываете его следующим образом:
output=$(java Java_Program)
или
output=`java Java_Program`
(Вы часто слышите аргументы, что предпочтительнее использовать первый синтаксис.)
Затем вы можете передать это в stdin следующего процесса:
echo $output > java Java_Program_2
Более просто, вы можете просто объединить свои процессы:
java Java_Program | java Java_Program_2
Ответ 2
Я не уверен, что я что-то пропустил, но мне кажется, что вы можете просто перенести первую программу на stdout и соединить обе программы вместе, не так ли? Вам даже не понадобится командный файл.
Ответ 3
В вашей программе Java распечатайте идентификатор с помощью System.out.println(id);
В вашей оболочке script вы можете выполнить Программу Java и сохранить идентификатор в переменной. Например:
ID=$(java JavaProgram)
Теперь запустите Java Program_2 с id:
java JavaProgram2 $ID
В Java Program_2 идентификатор войдет в ваш метод main
в args[0]
.
Вы можете сделать это за один шаг:
java JavaProgram2 $(java JavaProgram)
Кстати, если у вас есть вывод в файле с именем opt.txt
, вы можете прочитать его содержимое в переменной вроде этого:
CONTENTS=$(cat opt.txt)
Ответ 4
Я бы не пошел с вариантом 1, поскольку диапазон кодов выхода, который вы можете использовать, очень ограничен, некоторые из них имеют особые значения и не переносимы.
Для варианта 2 просто используйте variable="$(command)"
или
variable="`command`"
(Я использовал двойные кавычки, если в выводе command
есть пробелы, но я думаю, что это тупо, потому что ваш параметр должен быть одним номером!)
В вашем случае вы можете либо использовать cat opt.txt
в качестве команды, либо вы можете вырезать посредника и напрямую вызвать первую Java-программу в своей команде (тогда вам вообще не понадобится файл opt.txt
). Вы даже можете вырезать переменную и сделать все в одной строке.
Ответ 5
Итак, вы записываете вывод команды ssh:
java Prg2 $(ssh host java Prg1))
Использование кода выхода не является хорошей идеей, потому что коды выхода, отличные от 0, обычно указывают на ошибку.