使Java程序返回值给调用的Shell脚本

11

Unix高手们!

我有一个Java程序,它将一些参数传递给Servlet。 Servlet将信息输入到数据库中,并将创建的行的ID返回给调用它的Java程序。 Java程序在Unix shell脚本中运行,稍后会调用另一个Java程序Java Program_2(例如)。

我的问题是-我需要将从Java Program得到的ID作为参数传递给同一shell脚本中的Java Program_2。有没有最佳实践?

我目前正在使用以下内容-

1)使用System.exit()使Java程序返回退出代码。这样做的问题有两个-如何在变量中捕获退出代码?这样做对吗?退出代码实际上是用于返回程序的成功参数......

2)将输出写入文件java Java_Program >opt.txt。如果我这样做,那么我该如何再次读取shell变量中opt.txt的内容?

谢谢!

编辑:实际上,我应该先提到这个......这些程序位于不同的计算机上。我使用脚本ssh进入另一台计算机..然后运行Java程序2。因此,我无法将两者连接起来。


1
只需检查 $?。如果它是0,则认为程序已经正常退出,而如果它是非零的,则认为它具有失败退出。 - tchrist
5个回答

12

我不建议使用退出状态来传递数据,因为您所述的原因。捕获退出状态取决于您使用的shell,但在Bash中,特殊的$?变量包含了上一个执行进程的退出状态。

将数据写入标准输出通常更加惯用。在Bash中,您可以使用以下方式进行捕获:

output=$(java Java_Program)

或者:

output=`java Java_Program`

你经常会听到人们主张使用第一种语法。

然后,你可以使用以下方式将其输入到下一个进程的标准输入中:

echo $output > java Java_Program_2

更简单的方法是,您可以直接将进程管道连接在一起:

java Java_Program | java Java_Program_2

你好,这个程序完美运行。但是我应该再添加一个东西……这两个程序在不同的机器上。我通过 SSH 连接到另一台机器,然后在同一个 shell 脚本中运行第二个 Java 程序。现在的问题是……我无法在一台机器上使用另一台机器上的变量。 - Jai
@Jai:好的,说得对。顺便问一下,你刚才是不是给这个问题点了踩?如果你刚刚更新了问题并包含了一个关键细节,那么再去踩所有给出原始问题正确答案的人就没有什么意义了! - Oliver Charlesworth
不不不...我没有这样做。事实上,我在你之前已经点赞了。我甚至觉得这个答案被踩了很奇怪。 - Jai
@Jai:好的,那么。你刚离开留下评论的同时有人给它点了踩。嗯,没关系! - Oliver Charlesworth

5

我不确定是否错过了什么,但我认为你只需让第一个程序写入stdout并将两个程序通过管道连接起来,是吗?你甚至不需要一个shell脚本。


1
我之前应该提到这个...这些程序在不同的机器上。我使用脚本ssh进入另一台机器,然后运行Java程序2。 - Jai
5
没问题,您可以使用“ssh other-machine-name java Program1 | java Program2”命令。 - Robin Green
@Robin Green - 成功了!非常感谢! - Jai

2

在您的Java程序中,您可以使用System.out.println(id);打印出id。

在您的shell脚本中,您可以执行Java程序并将id存储在变量中。例如:

ID=$(java JavaProgram)

现在,使用id执行Java程序_2:

java JavaProgram2 $ID

在Java程序2中,ID将会传入你的main方法的args[0]中。
你甚至可以一步完成这个过程:
java JavaProgram2 $(java JavaProgram)

顺便提一下,如果你的输出存储在名为opt.txt的文件中,你可以像这样将其内容读入变量中:
CONTENTS=$(cat opt.txt)

你好,这个程序完美地运行了。但是我应该再添加一件事情……这两个程序在不同的机器上。我通过ssh登录到另一个机器,然后在同一个shell脚本中运行第二个Java程序。现在的问题是……我不能在一台机器上使用变量在另一台机器上。我仍然会把这个作为我的问题的答案。 - Jai

0

我不会选择选项1,因为你可以使用的退出代码范围非常有限,其中一些具有特殊含义,并且它不具备可移植性。

对于选项2,只需使用variable="$(command)"

variable="`command`"

(我在使用双引号是为了防止command的输出中有任何空格,但我想这很愚蠢,因为您的参数必须是一个单一的数字!)

在您的情况下,您可以使用cat opt.txt作为命令,或者您可以切掉中间人并直接调用命令中的第一个Java程序(那么您将不需要opt.txt文件)。您甚至可以切掉变量并在一行中完成所有操作。


1
“export”通常是不必要的,除非您打算将“variable”变成一个环境变量,以便子进程可以看到它。 - Oliver Charlesworth
在赋值中,引号是无意义的;括号或已弃用的反引号可以捕获整个输出。var=$(echo "foo bar")就足够了 - 只是对于输出而言,使用echo $varecho "$var"会有所不同,但如果您在赋值中使用它们,则不会保存它们。)foo和bar之间有两个空格。 - user unknown

0

所以你捕获了ssh命令的输出:

java Prg2 $(ssh host java Prg1))

使用退出代码并不是一个好主意,因为与0不同的退出代码通常表示错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接