【问题标题】:Make java program return value to calling shell script使java程序返回值调用shell脚本
【发布时间】:2011-08-29 16:35:49
【问题描述】:

Unix 大师!

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

我的问题是 - 我需要将我们从 Java Program 获得的 ID 作为参数传递给同一 shell 中的 Java Program_2脚本。有什么最佳做法吗?

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

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

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

非常感谢!

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

【问题讨论】:

  • 只需检查$?。如果为0,则认为程序正常退出,如果不为0,则认为退出失败。

标签: java shell unix


【解决方案1】:

出于您所说的原因,我不建议使用退出状态来携带数据。捕获退出状态取决于您使用的 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 进入另一个,然后运行第二个 java 程序(在同一个 shell 脚本中)。现在的问题是..我不能在另一台机器上使用变量。
  • @Jai:很公平。顺便说一句,你刚刚投反对票了吗?如果您刚刚更新了您的问题以包含一个关键细节,那么对所有给您原始问题正确答案的人投反对票是没有意义的!
  • 不不不……我没有。我之前实际上已经为你投票了。甚至我都觉得这个答案被否决了很奇怪
  • @Jai:那好吧。有人在您发表评论的同时投了反对票。哦,好吧!
【解决方案2】:

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

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

variable="`command`"

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

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

【讨论】:

  • export 通常是不必要的,除非您打算将 variable 变成对子进程可见的环境变量。
  • 引号在作业中毫无意义;括号或不推荐使用的反引号捕获整个输出。 var=$(echo "foo bar")* 就足够了 - 只是对于输出来说,无论您使用 echo $var 还是 echo "$var",它都会有所不同,但如果您在作业中使用它们,则以后不要保存它们。 *) foo 和 bar 之间有两个空格。
【解决方案3】:

我不确定我是否遗漏了什么,但在我看来,您可以让第一个程序写入标准输出并将两个程序连接在一起,不是吗?你甚至不需要 shellscript。

【讨论】:

  • 实际上我应该在之前提到这一点......程序在不同的机器上。我使用脚本 ssh 到另一台机器..然后运行 ​​java 程序 2
  • @Jai 没问题 - 只需使用 ssh other-machine-name java Program1 | java Program2
  • @Robin Green - 有效!非常感谢!
【解决方案4】:

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

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

ID=$(java JavaProgram)

现在,使用 id 执行 Java Program_2:

java JavaProgram2 $ID

在 Java Program_2 中,ID 将进入 args[0] 中的 main 方法。

您甚至可以一步完成:

java JavaProgram2 $(java JavaProgram)

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

CONTENTS=$(cat opt.txt)

【讨论】:

  • 您好,这非常有效。但是我应该添加另一件事......这两个程序在不同的机器上。我 ssh 进入另一个,然后运行第二个 java 程序(在同一个 shell 脚本中)。现在的问题是..我不能在另一台机器上使用该变量。我仍然会以此作为我问题的答案。
【解决方案5】:

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

java Prg2 $(ssh host java Prg1))

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 2011-09-27
    • 2015-11-12
    • 2013-07-16
    • 2016-03-14
    • 1970-01-01
    相关资源
    最近更新 更多