Грубая труба в исполнении sh [дубликат]

11
задан tim_yates 3 February 2016 в 22:01
поделиться

4 ответа

Это работает для меня:

def p = 'ps aux'.execute() | 'grep foo'.execute() | ['awk', '{ print $1 }'].execute()
p.waitFor()
println p.text

по неизвестной причине, параметры awk не могут быть отправлены только с одной строкой (я не знаю, почему! Возможно, bash цитирует что-то по-другому ). Если вы сбросите с помощью команды поток ошибок, вы увидите ошибку относительно компиляции awk-скрипта.

Изменить: Фактически,

  1. "-string-".execute() делегировать to Runtime.getRuntime().exec(-string-)
  2. Это задание bash для обработки аргументов, содержащих пробелы с «или». Runtime.exec или ОС не знают кавычки
  3. Выполнение "grep ' foo'".execute() выполняет команду grep, с ' в качестве первых параметров, а foo' - вторым: это неверно. То же самое для awk
12
ответ дан Jérémie B 1 September 2018 в 02:05
поделиться

Если вы хотите его асинхронно, я рекомендую

 proc.consumeProcessOutputStream(new LineOrientedOutputStream() {
        @Override
        protected void processLine(String line) throws IOException {
           println line
        }
    }
    );
0
ответ дан Gilad Baruchian 1 September 2018 в 02:05
поделиться

Это сработало для меня

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
0
ответ дан Here_2_learn 1 September 2018 в 02:05
поделиться

Вы можете сделать это, чтобы разрешить оболочку:

// 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
10
ответ дан tim_yates 1 September 2018 в 02:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: