在java中运行bash shell脚本

我想从我的程序中运行一个shell脚本,但似乎没有做任何事情。 我直接在linux终端运行相同的命令,它工作正常,所以我猜它是我的java代码。 正如您所看到的,我首先使用PrintWriter将命令写入shell脚本,但我希望这不会影响shell脚本本身的运行。 任何帮助,将不胜感激!

public static void main(String[] args) { // TODO Auto-generated method stub String nfdump = "nfdump -o csv -r /home/shane/Documents/nfdump/nfcapd.201211211526>blank.txt"; try { FileWriter fw = new FileWriter("/home/shane/Documents/script.sh"); PrintWriter pw = new PrintWriter(fw); pw.println("#!/bin/bash"); pw.println(nfdump); pw.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } Process proc = null; try { proc = Runtime.getRuntime().exec("sh /home/shane/Documents/script.sh"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

您应该使用返回的Process来获取结果。

Runtime#exec作为单独的进程执行命令,并返回Process类型的对象。 您应该调用Process#waitFor以便程序等到新进程完成。 然后,您可以在返回的Process对象上调用Process.html#getOutputStream()以检查已执行命令的输出。

创建流程的另一种方法是使用ProcessBuilder

 Process p = new ProcessBuilder("myCommand", "myArg").start(); 

使用ProcessBuilder ,您可以将命令的参数列为单独的参数。

请参阅ProcessBuilder和Runtime.exec()以及ProcessBuilder与Runtime.exec()之间的区别,以了解有关Runtime#execProcessBuilder#start之间差异的更多信息。

试试这个,它会起作用。

 String[] cmd = new String[]{"/bin/sh", "path/to/script.sh"}; Process pr = Runtime.getRuntime().exec(cmd); 

从Java执行脚本时,它会生成一个未设置PATH环境变量的新shell。

使用以下代码设置PATH env变量应运行脚本。

 String[] env = {"PATH=/bin:/usr/bin/"}; String cmd = "you complete shell command"; //eg test.sh -dparam1 -oout.txt Process process = Runtime.getRuntime().exec(cmd, env);