使用Java Runtime类运行多个unix命令

时间:2014-06-25 12:49:07

标签: java unix

我正在尝试使用Runtime类来执行一些UNIX命令,但如果我尝试使用cd命令,我会遇到问题。

这是我的Java程序:

import java.io.*;

public class JavaRunCommand {

    public static void main(String args[]) {

        String s = null;

        try {

            Process p = Runtime.getRuntime().exec("cd;cat test.txt|grep Hello");

            BufferedReader stdInput = new BufferedReader(new
                 InputStreamReader(p.getInputStream()));

            BufferedReader stdError = new BufferedReader(new
                 InputStreamReader(p.getErrorStream()));

            // read the output from the command
            System.out.println("Here is the standard output of the command:\n");
            while ((s = stdInput.readLine()) != null) {
                System.out.println(s);
            }

            // read any errors from the attempted command
            System.out.println("Here is the standard error of the command (if any):\n");
            while ((s = stdError.readLine()) != null) {
                System.out.println(s);
            }

            System.exit(0);
        }
        catch (IOException e) {
            System.out.println("exception..");
            e.printStackTrace();
            System.exit(-1);
        }
    }
}

如果我执行此操作,那么我将得到一个例外:

java.io.IOException: Cannot run program "cd": error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1041)
    at java.lang.Runtime.exec(Runtime.java:617)
    at java.lang.Runtime.exec(Runtime.java:450)
    at java.lang.Runtime.exec(Runtime.java:347)
    at JavaRunCommand.main(JavaRunCommand.java:11)
Caused by: java.io.IOException: error=2, No such file or directory
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:135)
    at java.lang.ProcessImpl.start(ProcessImpl.java:130)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1022)
    ... 4 more

如果我想在Java中使用它,请告诉我如何运行多个命令。

3 个答案:

答案 0 :(得分:3)

如果您更换

Process p = Runtime.getRuntime().exec("cd;cat test.txt|grep Hello");

Process p = Runtime.getRuntime().exec(new String[] { "/bin/sh", "-c", "cd && cat test.txt | grep Hello" });

应该这样做。

由于cd是内置shell命令,因此需要调用shell来执行它。使用Windows时,您需要拨打"cmd /c"

答案 1 :(得分:2)

cd是用于遍历目录的内置shell命令。因此,它不是一个可以按照你尝试的方式运行的实际unix命令。

最简单的解决方案是在您调用的命令中使用绝对路径。例如,而不是尝试运行"cd /my/dir; cat test.txt",只需致电"cat /my/dir/test.txt"

答案 2 :(得分:0)

当您询问如何运行多个命令并以cd;cat test.txt|grep Hello为例时,您需要sh来处理您的命令,因为它不是单个可执行程序。

尽管有安全隐患(*),但你可以做到

Process p = Runtime.getRuntime().exec("/bin/sh -c 'cd;cat test.txt|grep Hello'");

(*)通常认为这是一种糟糕的安全措施,因为根据环境可以执行不需要的命令