Unix大师!
我有一个 Java程序,它将一些参数传递给 Servlet 。 Servlet将信息输入到DB中,并将创建的行的
我的问题是这个 - 我需要将 ID 从 Java程序作为参数传递给同一个shell中的 Java Program_2 脚本。那有什么最佳实践吗?
到目前为止我正在处理的事情 -
1)使java程序返回带有System.exit()
的退出代码。 2个问题 - 我如何捕获shell中变量的退出代码?这是正确的方法吗?退出代码实际上是用于返回程序的成功参数...
2)将输出写入文件java Java_Program >opt.txt
。如果我这样做,那么如何再次在shell变量中读取opt.txt
的内容?
非常感谢!
编辑:我应该在实际之前提到这个...程序在不同的机器上。我使用脚本ssh进入另一台机器,然后运行java程序2.因此,我无法管道这两个。
答案 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);
在shell脚本中,您可以执行Java程序并将id存储在变量中。例如:
ID=$(java JavaProgram)
现在,使用id:
执行Java Program_2java 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的退出代码通常表示错误。