在java中运行bash shell脚本

时间:2012-12-04 16:35:26

标签: java 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();
    }

3 个答案:

答案 0 :(得分:27)

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

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

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

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

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

请参阅Difference between ProcessBuilder and Runtime.exec()ProcessBuilder vs Runtime.exec(),详细了解Runtime#execProcessBuilder#start之间的差异。

答案 1 :(得分:6)

试试这个,它会起作用。

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

答案 2 :(得分:5)

当您从Java执行脚本时,它会生成一个新的shell,其中PATH环境变量不是 组。

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

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