Сделать 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, обычно указывают на ошибку.