Groovy добавляет execute
метод, String
облегчающий выполнение оболочек;
println "ls".execute().text
но если происходит ошибка, то нет никакого результата. Есть ли простой способ вывести как стандартную ошибку, так и стандартную? (кроме создания пакета кода для: создания двух потоков для чтения обоих входных потоков, затем с использованием родительского потока, чтобы дождаться их завершения, а затем преобразовать строки обратно в текст?)
Было бы хорошо иметь что-то вроде;
def x = shellDo("ls /tmp/NoFile")
println "out: ${x.out} err:${x.err}"
Ответы:
Хорошо, решил это сам;
дисплеи:
out> err> ls: cannot access /badDir: No such file or directory
источник
envVars = ["P4PORT=p4server:2222", "P4USER=user", "P4PASSWD=pass", "P4CLIENT=p4workspace"]; workDir = new File("path"); cmd = "bash -c \"p4 change -o 1234\""; proc = cmd.execute(envVars, workDir);
"ls".execute()
возвращаетProcess
объект, поэтому"ls".execute().text
работает. Вы должны быть в состоянии просто прочитать поток ошибок, чтобы определить, были ли какие-либо ошибки.Существует дополнительный метод на
Process
которые позволяют пропускать ,StringBuffer
чтобы получить текст:consumeProcessErrorStream(StringBuffer error)
.Пример:
источник
источник
runCommand("echo HELLO WORLD")
Я считаю это более идиоматичным:
Как упоминается в другом посте, это блокировка вызовов, но поскольку мы хотим работать с выводом, это может быть необходимо.
источник
Чтобы добавить еще одну важную информацию к приведенным выше ответам -
Для процесса
всегда старайтесь использовать
скорее, чем
захватывать выходные данные после выполнения команд в groovy, поскольку последний является блокирующим вызовом ( ТАК вопрос по причине ).
источник
источник
но в случае сбоя команды процесс завершится
источник
sh
берутся?sh
является частью Дженкинс заводной DSL. Вероятно, не полезно здесь