使java程序返回值为调用shell脚本

时间:2011-05-20 13:42:50

标签: java shell unix

Unix大师!

我有一个 Java程序,它将一些参数传递给 Servlet 。 Servlet将信息输入到DB中,并将创建的行的 ID 返回给调用它的java程序。 Java程序在Unix shell脚本中运行,后来继续调用另一个java程序 Java Program_2 (比如说)。

我的问题是这个 - 我需要将 ID 从 Java程序作为参数传递给同一个shell中的 Java Program_2 脚本。那有什么最佳实践吗?

到目前为止我正在处理的事情 -

1)使java程序返回带有System.exit()的退出代码。 2个问题 - 我如何捕获shell中变量的退出代码?这是正确的方法吗?退出代码实际上是用于返回程序的成功参数...

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

非常感谢!

编辑:我应该在实际之前提到这个...程序在不同的机器上。我使用脚本ssh进入另一台机器,然后运行java程序2.因此,我无法管道这两个。

5 个答案:

答案 0 :(得分:12)

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

将数据写入stdout更加惯用。在Bash中,您可以按如下方式捕获它:

output=$(java Java_Program)

或:

output=`java Java_Program`

(您经常会听到第一种语法首选的论点。)

然后您可以使用以下命令将其提供给下一个流程的标准输入:

echo $output > java Java_Program_2

更简单地说,您可以简单地将流程组合在一起:

java Java_Program | java Java_Program_2

答案 1 :(得分:5)

我不确定我是否遗漏了一些东西,但听起来我可以让第一个程序写入stdout并将两个程序一起管道,不是吗?你甚至不需要一个shellcript。

答案 2 :(得分:2)

在您的Java程序中使用System.out.println(id);

打印出id

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

ID=$(java JavaProgram)

现在,使用id:

执行Java Program_2
java JavaProgram2 $ID

在Java Program_2中,该ID将出现在main中的args[0]方法中。

您甚至可以一步完成:

java JavaProgram2 $(java JavaProgram)

顺便说一句,如果你在一个名为opt.txt的文件中有输出,你可以将其内容读入这样的变量:

CONTENTS=$(cat opt.txt)

答案 3 :(得分:0)

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

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

variable="`command`"

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

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

答案 4 :(得分:0)

所以你捕获了ssh-command的输出:

java Prg2 $(ssh host java Prg1))

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