Сделайте, чтобы Java-программа возвращала значение вызывающему скрипту - PullRequest
10 голосов
/ 20 мая 2011

Unix гуру!

У меня есть Java-программа , которая передает некоторые параметры в Сервлет . Сервлет вводит информацию в БД и возвращает обратно ID строки, созданной обратно в Java-программу, которая ее вызывает. Java-программа запускается в сценарии оболочки Unix , который позже вызывает другую Java-программу Java Program_2 (скажем).

Моя проблема заключается в следующем: мне нужно передать ID , который мы получаем из Java Program в качестве параметра, в Java Program_2 в том же сценарии оболочки. Есть ли лучшая практика для этого?

Вещи, с которыми я работаю до сих пор -

1) Заставьте java-программу вернуть код завершения с System.exit(). 2 вопроса с этим - Как поймать код выхода в переменной в оболочке? Это правильный способ сделать это? Код выхода фактически предназначен для возврата параметра успеха программы ...

2) Записать вывод в файл java Java_Program >opt.txt. Если я сделаю это, то как мне снова прочитать содержимое opt.txt в переменной оболочки?

Большое спасибо!

Редактировать: Я должен был упомянуть об этом раньше, на самом деле ... программы на разных машинах. Я использую скрипт на другом компьютере с помощью скрипта .. и затем запускаю Java-программу 2. Следовательно, я не могу передать два.

Ответы [ 5 ]

12 голосов
/ 20 мая 2011

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

Запись данных в стандартный вывод гораздо идиоматичнее.В Bash вы записываете его следующим образом:

output=$(java Java_Program)

или:

output=`java Java_Program`

(вы часто будете слышать аргументы о том, что предпочтительным является первый синтаксис.)

Затем вы можете передать это в stdin вашего следующего процесса с помощью:

echo $output > java Java_Program_2

Проще говоря, вы можете просто связать ваши процессы вместе:

java Java_Program | java Java_Program_2
5 голосов
/ 20 мая 2011

Я не уверен, что что-то пропустил, но мне кажется, что вы могли бы просто позволить первой программе записать в stdout и передать обе программы вместе, не так ли?Тебе даже не понадобится шеллскрипт.

2 голосов
/ 20 мая 2011

В вашей Java-программе распечатайте идентификатор, используя System.out.println(id);

В вашем скрипте оболочки вы можете запустить Java-программу и сохранить идентификатор в переменной. Например:

ID=$(java JavaProgram)

Теперь выполните Java Program_2 с идентификатором:

java JavaProgram2 $ID

В Java Program_2 идентификатор будет входить в ваш метод main в args[0].

Вы даже можете сделать это за один шаг:

java JavaProgram2 $(java JavaProgram)

Кстати, если у вас есть вывод в файле с именем opt.txt, вы можете прочитать его содержимое в переменную, подобную этой:

CONTENTS=$(cat opt.txt)
0 голосов
/ 20 мая 2011

Таким образом, вы фиксируете вывод команды ssh:

java Prg2 $(ssh host java Prg1))

Использование кода выхода не очень хорошая идея, поскольку коды выхода, отличные от 0, обычно указывают на ошибку.

0 голосов
/ 20 мая 2011

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

Для варианта 2 просто используйте variable="$(command)" или

variable="`command`"

(я использовал двойные кавычки на случай, если в выводе command есть пробелы, но я думаю, что это глупо, потому что ваш параметр должен быть одним числом!)

В вашем случае вы можете либо использовать cat opt.txt в качестве команды, либо вы можете отключить посредника и напрямую вызвать первую программу Java в вашей команде (тогда вам вообще не понадобится файл opt.txt).Вы даже можете вырезать переменную и сделать все это в одной строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...