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を使用できます。これは、標準Cのsystem(3)関数がUnixおよびPosixシステムで実行することです。/bin/sh-c

ただし、複雑なコマンドが実行することを実行するシェルスクリプトを記述し、そのシェルスクリプトを実行することをお勧めします。これにより、Javaコードを変更せずに、そのシェルスクリプトを(テストおよび)改善することができます。

于 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"});

パイプなどのリダイレクト演算子はシェル機能であるため、パイプを使用するコマンドを実行することはできませんが|、exec()に渡されるコマンドはコマンドシェルでは実行されないことに注意してください。

于 2012-09-02T18:27:02.583 に答える