采用Java运行的一个bash shell脚本(Running a bash shell scrip

2019-07-04 13:01发布

我想从我下面的程序运行一个shell脚本,但它似乎并没有做任何事情。 我直接在Linux终端运行相同的命令,它工作得很好,所以我猜这是我的Java代码。 正如你所看到的,我第一次写命令shell脚本利用一个PrintWriter,但我希望这不会影响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();
    }

Answer 1:

你应该使用返回的Process得到的结果。

Runtime#exec执行该命令作为一个单独的过程,并返回类型的对象Process 。 你应该调用Process#waitFor让你的程序等待,直到新的过程完成。 然后,可以调用Process.html#getOutputStream()返回关于Process目的是检查被执行的命令的输出。

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

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

ProcessBuilder ,你列出的命令作为独立参数的参数。

见的ProcessBuilder和的Runtime.exec()之间的区别和的ProcessBuilder VS的Runtime.exec()了解更多有关之间的差异Runtime#execProcessBuilder#start



Answer 2:

试试这个,它会工作。

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


Answer 3:

当您从Java执行脚本它产生一个新的外壳,其中PATH环境变量未设置。

设置使用下面的代码应该运行脚本的PATH环境变量。

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);


文章来源: Running a bash shell script in java
标签: java shell