使用 groovy,如何通过管道传输多个 shell 命令?
Using groovy, how do you pipe multiple shell commands?
使用 Groovy 及其 java.lang.Process
支持,如何将多个 shell 命令通过管道连接在一起?
考虑这个 bash 命令(假设你的用户名是 foo
):
ps aux | grep ' foo' | awk '{print }'
这将打印出用户名 - 一行用于与您的用户帐户相关的某些进程。
使用 Groovy,ProcessGroovyMethods 文档和代码说我应该能够这样做以获得相同的结果:
def p = "ps aux".execute() | "grep ' foo'".execute() | "awk '{print }'".execute()
p.waitFor()
println p.text
但是,除此之外,我无法获得任何文本输出:
def p = "ps aux".execute()
p.waitFor()
println p.text
我一开始管道,println 就没有打印出任何东西。
想法?
您可以这样做,让 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 }'/].execute()
p.waitFor()
println p.text
这对我有用:
def p = 'ps aux'.execute() | 'grep foo'.execute() | ['awk', '{ print }'].execute()
p.waitFor()
println p.text
出于未知原因,awk 的参数不能仅使用一个字符串发送(我不知道为什么!也许 bash 引用的内容不同)。如果您使用命令转储错误流,您将看到与 awk 脚本编译相关的错误。
编辑:事实上,
"-string-".execute()
委托给 Runtime.getRuntime().exec(-string-)
- bash 处理包含带有 ' 或 " 的空格的参数是 bash 的工作。Runtime.exec 或 OS 不知道引号
- Executing
"grep ' foo'".execute()
执行命令grep,第一个参数为'
,第二个参数为foo'
:无效。 awk 也一样
如果你想要异步我推荐
proc.consumeProcessOutputStream(new LineOrientedOutputStream() {
@Override
protected void processLine(String line) throws IOException {
println line
}
}
);
这对我有用
def command = '''
ps aux | grep bash | awk '{print }'
'''
def proc = ['bash', '-c', command].execute()
proc.waitFor()
println proc.text
如果要运行多个命令,可以在命令中添加。
def command = '''
ls -ltr
cat secret
'''
def proc = ['bash', '-c', command].execute()
proc.waitFor()
println proc.text
使用 Groovy 及其 java.lang.Process
支持,如何将多个 shell 命令通过管道连接在一起?
考虑这个 bash 命令(假设你的用户名是 foo
):
ps aux | grep ' foo' | awk '{print }'
这将打印出用户名 - 一行用于与您的用户帐户相关的某些进程。
使用 Groovy,ProcessGroovyMethods 文档和代码说我应该能够这样做以获得相同的结果:
def p = "ps aux".execute() | "grep ' foo'".execute() | "awk '{print }'".execute()
p.waitFor()
println p.text
但是,除此之外,我无法获得任何文本输出:
def p = "ps aux".execute()
p.waitFor()
println p.text
我一开始管道,println 就没有打印出任何东西。
想法?
您可以这样做,让 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 }'/].execute()
p.waitFor()
println p.text
这对我有用:
def p = 'ps aux'.execute() | 'grep foo'.execute() | ['awk', '{ print }'].execute()
p.waitFor()
println p.text
出于未知原因,awk 的参数不能仅使用一个字符串发送(我不知道为什么!也许 bash 引用的内容不同)。如果您使用命令转储错误流,您将看到与 awk 脚本编译相关的错误。
编辑:事实上,
"-string-".execute()
委托给Runtime.getRuntime().exec(-string-)
- bash 处理包含带有 ' 或 " 的空格的参数是 bash 的工作。Runtime.exec 或 OS 不知道引号
- Executing
"grep ' foo'".execute()
执行命令grep,第一个参数为'
,第二个参数为foo'
:无效。 awk 也一样
如果你想要异步我推荐
proc.consumeProcessOutputStream(new LineOrientedOutputStream() {
@Override
protected void processLine(String line) throws IOException {
println line
}
}
);
这对我有用
def command = '''
ps aux | grep bash | awk '{print }'
'''
def proc = ['bash', '-c', command].execute()
proc.waitFor()
println proc.text
如果要运行多个命令,可以在命令中添加。
def command = '''
ls -ltr
cat secret
'''
def proc = ['bash', '-c', command].execute()
proc.waitFor()
println proc.text