Unix masterus!
我有一个Java程序,它将一些参数传递给Servlet。Servlet 将信息输入数据库,并将创建的行的 ID 返回给调用它的 java 程序。Java程序在Unix shell脚本中运行,后来继续调用另一个Java程序Java Program_2(比如)。
我的问题是这样的 - 我需要将我们从 Java 程序获得的 ID 作为参数传递给同一个 shell 脚本中的 Java Program_2。有没有这方面的最佳实践?
到目前为止,我正在处理的事情 -
1)使java程序返回带有System.exit()
的退出代码。2 个问题 - 如何在 shell 中的变量中捕获退出代码?这是正确的方法吗?退出代码实际上是用于返回程序的成功参数...
2) 将输出写入文件java Java_Program >opt.txt
。如果我这样做,那么如何再次读取 shell 变量中opt.txt
的内容?
多谢!
编辑:我应该在实际上之前提到这一点...程序在不同的机器上。我使用脚本ssh到另一台机器。然后运行 Java 程序 2。因此,我不能用管道连接两者。
您所述的原因,我不建议使用退出状态来携带数据。 捕获退出状态取决于您使用的 shell,但在 Bash 中,特殊的 $?
变量包含上次执行的进程的退出状态。
将数据写入标准输出要习惯得多。 在 Bash 中,您可以按如下方式捕获它:
output=$(java Java_Program)
或:
output=`java Java_Program`
(您经常会听到首选第一种语法的论点。
然后,您可以使用以下命令将其提供给下一个流程的 stdin:
echo $output > java Java_Program_2
更简单地说,您可以简单地将流程组合在一起:
java Java_Program | java Java_Program_2
我不确定我是否错过了什么,但在我看来,你可以让第一个程序写入 stdout 并将两个程序管道在一起,不是吗?你甚至不需要shellscript。
在 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)
我不会选择选项 1,因为您可以使用的退出代码范围非常有限,其中一些具有特殊含义,并且不可移植。
对于选项 2,只需使用 variable="$(command)"
或
variable="`command`"
(我使用了双引号以防command
的输出中有任何空格,但我想这很愚蠢,因为您的参数必须是单个数字!
在您的情况下,您可以使用cat opt.txt
作为命令,或者您可以省去中间人并直接调用命令中的第一个 Java 程序(这样您根本不需要 opt.txt
文件)。您甚至可以剪切出变量并在一行中完成所有操作。
所以你捕获了 ssh 命令的输出:
java Prg2 $(ssh host java Prg1))
使用退出代码不是一个好主意,因为退出代码与 0 不同,通常表示错误。