4

我正在尝试使用 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();
          }
4

2 回答 2

3

正如我所评论的,您可以exec使用 shell,例如/bin/sh-c后跟要解释的字符串。这就是标准 C 中的system(3)函数在 Unix 和 Posix 系统上所做的事情。

但是,我只是建议编写一个 shell 脚本来执行您的复杂命令,然后执行该 shell 脚本。这提供了在不更改 Java 代码的情况下(测试和)改进该 shell 脚本的能力。

于 2012-09-02T19:15:10.583 回答
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 中运行。

于 2012-09-02T18:27:02.583 回答