从Java运行Linux命令 - runtime.exe

时间:2012-09-02 18:20:59

标签: java linux find command runtime

我正在尝试使用Java运行时运行以下命令:

find /home/Alison/workspace/FunctionalTestFramework/src/com/q1labs/qa/selenium/screens -type d |   awk -F/ 'NF <= old_NF {print prev} {old_NF=NF; prev=$0} END {print $0}'

直接输入终端时该命令正常工作,但在以下函数中运行时,它会出现以下错误:

find: paths must precede expression: |
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
Process exitValue: 1

Java函数:

     try
        {            
            Runtime rt = Runtime.getRuntime();
            Process proc = rt.exec("find /home/Alison/workspace/FunctionalTestFramework/src/com/q1labs/qa/selenium/screens -type d |   awk -F/ 'NF <= old_NF {print prev} {old_NF=NF; prev=$0} END {print $0}'");
            InputStream stderr = proc.getErrorStream();
            InputStreamReader isr = new InputStreamReader(stderr);
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            while ( (line = br.readLine()) != null)
                System.out.println(line);
            int exitVal = proc.waitFor();
            System.out.println("Process exitValue: " + exitVal);
        } catch (Throwable t)
          {
            t.printStackTrace();
          }

2 个答案:

答案 0 :(得分:3)

正如我评论的那样,你可以exec一个shell,例如/bin/sh -c后跟要解释的字符串。这就是标准C中的system(3)函数在Unix&amp; Posix系统。

但是,我建议编写一个shell脚本来执行复杂命令所做的操作,并执行该shell脚本。这样就可以在不改变Java代码的情况下(测试和改进)shell脚本。

答案 1 :(得分:0)

尝试更换:

rt.exec("find /home/Alison/workspace/FunctionalTestFramework/src/com/q1labs/qa/selenium/screens -type d |   awk -F/ 'NF <= old_NF {print prev} {old_NF=NF; prev=$0} END {print $0}'");

由此:

rt.exec(new String[]{"find", "/home/Alison/workspace/FunctionalTestFramework/src/com/q1labs/qa/selenium/screens", "-type", "d"});

请注意,您将无法运行任何使用管道|的命令,因为管道等重定向操作符是shell功能,但传递给exec()的命令不在命令shell中运行。