Groovy menambahkan execute
metode String
untuk membuat mengeksekusi shell cukup mudah;
println "ls".execute().text
tetapi jika kesalahan terjadi, maka tidak ada output yang dihasilkan. Apakah ada cara mudah untuk mengeluarkan standard error dan standard out? (selain membuat banyak kode untuk; membuat dua utas untuk membaca kedua aliran input, kemudian menggunakan aliran induk untuk menunggu mereka selesai kemudian mengonversi string kembali ke teks?)
Akan menyenangkan memiliki sesuatu seperti;
def x = shellDo("ls /tmp/NoFile")
println "out: ${x.out} err:${x.err}"
Jawaban:
Oke, selesaikan sendiri;
menampilkan:
out> err> ls: cannot access /badDir: No such file or directory
sumber
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()
mengembalikanProcess
objek yang mengapa"ls".execute().text
bekerja. Anda harus bisa membaca aliran kesalahan untuk menentukan apakah ada kesalahan.Ada metode ekstra pada
Process
yang memungkinkan Anda untuk melewatiStringBuffer
untuk mengambil teks:consumeProcessErrorStream(StringBuffer error)
.Contoh:
sumber
sumber
runCommand("echo HELLO WORLD")
Saya menemukan ini lebih idiomatis:
Seperti posting lain menyebutkan, ini memblokir panggilan, tetapi karena kami ingin bekerja dengan output, ini mungkin diperlukan.
sumber
Untuk menambahkan satu lagi informasi penting ke jawaban yang diberikan di atas -
Untuk suatu proses
selalu coba gunakan
daripada
untuk menangkap output setelah menjalankan perintah di groovy karena yang terakhir adalah panggilan pemblokiran ( SO pertanyaan karena alasan ).
sumber
sumber
tetapi jika perintah gagal proses akan berakhir
sumber
sh
?sh
adalah bagian dari DSL Jenkins asyik. Mungkin tidak berguna di sini