Это работает для меня:
def p = 'ps aux'.execute() | 'grep foo'.execute() | ['awk', '{ print $1 }'].execute()
p.waitFor()
println p.text
по неизвестной причине, параметры awk не могут быть отправлены только с одной строкой (я не знаю, почему! Возможно, bash цитирует что-то по-другому ). Если вы сбросите с помощью команды поток ошибок, вы увидите ошибку относительно компиляции awk-скрипта.
Изменить: Фактически,
"-string-".execute()
делегировать to Runtime.getRuntime().exec(-string-)
"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 $1}'
'''
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
Вы можете сделать это, чтобы разрешить оболочку:
// 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