如何从 Java 中运行的进程中获取 bash 命令退出代码?
Posted
技术标签:
【中文标题】如何从 Java 中运行的进程中获取 bash 命令退出代码?【英文标题】:How do I get the bash command exit code from a Process run from within Java? 【发布时间】:2011-05-04 16:49:12 【问题描述】:我有一个程序是:
import java.io.*;
import java.util.*;
public class ExecBashCommand
public static void main(String args[]) throws IOException
if (args.length <= 0)
System.err.println("Need command to run");
System.exit(-1);
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("./nv0914 < nv0914.challenge");
Process process1 = runtime.exec("echo $?");
InputStream is = process1.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
//System.out.printf("Output of running %s is:", Arrays.toString(args));
while ((line = br.readLine()) != null)
System.out.println(line);
注意:nv0914 是一个 bash 可执行文件,而 nv0914.challenge 是一个文本文件。
当我在终端中运行任何正常命令时,然后如果我使用echo $?
检查退出代码。现在我想通过使用程序来做同样的事情,但程序只是给出输出$?
。请帮帮我!
【问题讨论】:
process.exitValue() 有什么问题? 我回滚了对问题的最后一个更改,其中 OP 部分实施了 Peter Lawrey 提供的解决方案。这是对问题的重大更改,并且确实使未来的读者无法使用,IMO。 【参考方案1】:Process.waitFor() 返回一个int
这是退出代码返回的地方。如果您启动一个不相关的程序,则不会有以前的退出代码,这就是为什么它不会返回任何有用的东西。
您不能可靠地使用 exitValue(),因为您可以在程序完成之前调用它。你应该只在调用 waitFor() 之后调用它(它会给出相同的退出代码 waitFor() )
来自exitValue 的Javadoc
抛出:IllegalThreadStateException - 如果此 Process 对象表示的子进程尚未终止。
【讨论】:
他认为要 echo 的 argv 在 echo 得到它们之前由 shell 解释,但事实并非如此。 嗨彼得,感谢您的评论..但它给了我一个错误。 @mad-programmer,您需要处理 InterruptedException。 ;) 当我使用 waitFor() 时,它只是给了我一个空白终端,甚至没有一个新的 bash 命令行..只是一个空命令行。 您不会看到 bash 命令行。 waitFor 在 bash 脚本完成之前不会返回。我建议你尝试一些你知道会返回的东西。以上是关于如何从 Java 中运行的进程中获取 bash 命令退出代码?的主要内容,如果未能解决你的问题,请参考以下文章