【问题标题】:Running Linux command from Java - runtime.exe从 Java 运行 Linux 命令 - runtime.exe
【发布时间】:2012-08-27 15:23:38
【问题描述】:

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

【问题讨论】:

  • 我建议您编写特定的 shell 脚本,然后从 Java 运行该脚本。

标签: java linux find command runtime


【解决方案1】:

正如我评论的那样,您可以 exec 一个外壳,例如/bin/sh-c 后跟要解释的字符串。这就是标准 C 中的 system(3) 函数在 Unix 和 Posix 系统上的作用。

但是,我只是建议编写一个 shell 脚本来执行您的复杂命令,然后执行该 shell 脚本。这使您能够(测试和)改进该 shell 脚本,而无需更改您的 Java 代码。

【讨论】:

    【解决方案2】:

    尝试替换:

    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 中运行。

    【讨论】:

    • 你可以执行一个shell,例如/bin/sh-c 后跟要解释的字符串。这就是标准 C 中的 system(3) 函数在 Unix 和 Posix 系统上所做的。
    • @BasileStarynkevitch 你能把它作为一个有效的答案吗,谢谢。
    猜你喜欢
    • 2020-07-06
    • 2012-07-20
    • 1970-01-01
    • 2011-04-11
    • 2018-12-04
    • 2013-07-22
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    相关资源
    最近更新 更多