无法从命令`ps -eaf |获得正确的输出grep groovy`使用groovy

时间:2012-11-21 11:10:34

标签: shell groovy process

如果我使用shell:

ps -eaf | grep groovy

我可以得到这样的输出:

[root@test www]# ps -eaf | grep groovy
root       924   539  1 03:15 pts/0    00:00:05 /usr/java/jdk1.6.0_31/bin/java -classpath
/root/dev/groovy-1.8.8/lib/groovy-1.8.8.jar -Dscript.name=./groovysh -Dprogram.name=groovysh 
-Dgroovy.starter.conf=/root/dev/groovy-1.8.8/conf/groovy-starter.conf 
-Dgroovy.home=/root/dev/groovy-1.8.8 -Dtools.jar=/usr/java/jdk1.6.0_31/lib/tools.jar
org.codehaus.groovy.tools.GroovyStarter --main org.codehaus.groovy.tools.shell.Main 
--conf /root/dev/groovy-1.8.8/conf/groovy-starter.conf --classpath .
root      1127   562  0 03:20 pts/1    00:00:00 grep groovy
[root@test www]#

但是如果我在groovy中运行这个命令:

proc = "ps -eaf | grep groovy".execute()

proc.waitFor()  // => return 1

proc.in.text  // => return ""

proc.err.text  // => see following

proc.err.text将是ps命令的文档:

ERROR: Garbage option.

********* simple selection *********  ********* selection by list *********
-A all processes                      -C by command name
-N negate selection                   -G by real group ID (supports names)
-a all w/ tty except session leaders  -U by real user ID (supports names)
-d all except session leaders         -g by session OR by effective group name
-e all processes                      -p by process ID
T  all processes on this terminal     -s processes in the sessions given

但如果我运行ps -eaf,那就是正确的。

似乎|无法使用,是真的吗?如何解决?

1 个答案:

答案 0 :(得分:2)

是的,你不能像这样使用shell输出管道和重定向。

一种选择是:

Process ps = 'ps -eaf'.execute()
Process gr = 'grep groovy'.execute()

Process all = ps | gr

println all.text

另一种是使用List形式的execute:

将它包装在一个新的shell中
println( [ 'sh', '-c', 'ps -eaf | grep groovy' ].execute().text )