我正在尝试使用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();
}
答案 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中运行。