Les*_*ood 11 bash shell groovy process
使用Groovy及其java.lang.Process支持,如何将多个shell命令一起管道?
考虑这个bash命令(并假设您的用户名是foo):
ps aux | grep ' foo' | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)
这将打印出用户名 - 与您的用户帐户相关的某些进程的一行.
使用Groovy,ProcessGroovyMethods文档和代码说我应该能够做到这一点来实现相同的结果:
def p = "ps aux".execute() | "grep ' foo'".execute() | "awk '{print $1}'".execute()
p.waitFor()
println p.text
Run Code Online (Sandbox Code Playgroud)
但是,我无法获得除此之外的任何文本输出:
def p = "ps aux".execute()
p.waitFor()
println p.text
Run Code Online (Sandbox Code Playgroud)
一旦我开始配管,println就不会打印出任何东西.
思考?
Jér*_*e B 18
这对我有用:
def p = 'ps aux'.execute() | 'grep foo'.execute() | ['awk', '{ print $1 }'].execute()
p.waitFor()
println p.text
Run Code Online (Sandbox Code Playgroud)
由于一个未知的原因,awk的参数不能只用一个字符串发送(我不知道为什么!也许bash引用不同的东西).如果使用命令转储错误流,则会看到相对于awk脚本编译的错误.
编辑:事实上,
"-string-".execute() 委托给 Runtime.getRuntime().exec(-string-)"grep ' foo'".execute()命令grep,'作为第一个参数,foo'作为第二个:它无效.同样的awktim*_*tes 11
您可以这样做,让shell对其进行排序:
// slash string at the end so we don't need to escape ' or $
def p = ['/bin/bash', '-c', /ps aux | grep ' foo' | awk '{print $1}'/].execute()
p.waitFor()
println p.text
Run Code Online (Sandbox Code Playgroud)
这对我有用
def command = '''
ps aux | grep bash | awk '{print $1}'
'''
def proc = ['bash', '-c', command].execute()
proc.waitFor()
println proc.text
Run Code Online (Sandbox Code Playgroud)
如果要运行多个命令,可以在命令中添加。
def command = '''
ls -ltr
cat secret
'''
def proc = ['bash', '-c', command].execute()
proc.waitFor()
println proc.text
Run Code Online (Sandbox Code Playgroud)