Saya memiliki banyak panggilan sistem dalam ruby seperti berikut dan saya ingin memeriksa kode keluar mereka secara bersamaan sehingga skrip saya keluar jika perintah itu gagal.
system("VBoxManage createvm --name test1")
system("ruby test.rb")
Saya ingin sesuatu seperti
system("VBoxManage createvm --name test1", 0)
<- di mana parameter kedua memeriksa kode keluar dan menegaskan bahwa panggilan sistem berhasil, dan jika tidak, itu akan menimbulkan kesalahan atau melakukan sesuatu semacam itu.
Apakah itu mungkin?
Saya telah mencoba sesuatu di sepanjang garis ini dan itu tidak berhasil juga.
system("ruby test.rb")
system("echo $?")
atau
`ruby test.rb`
exit_code = `echo $?`
if exit_code != 0
raise 'Exit code is not zero'
end
exit_code
akan menjadi string - baik"0\n"
atau"1\n"
, jadiexit_code != 0
akan selalu benarJawaban:
Dari dokumentasi :
Selanjutnya
sumber
[10] pry(main)> system("touch /root/test 2> /dev/null") => false [11] pry(main)> $?.exitstatus => 0 [12] pry(main)> system("touch /root/test 2> /dev/null"); $?.exitstatus => 1
system
, backticks,%x
danexec
disediakan di sini: stackoverflow.com/questions/6338908/…Bagi saya, saya lebih suka menggunakan `` untuk memanggil perintah shell dan memeriksa $? untuk mendapatkan status proses. $? adalah objek status proses, Anda bisa mendapatkan informasi proses perintah dari objek ini, termasuk: kode status, status eksekusi, pid, dll.
Beberapa metode yang berguna dari $? obyek:
sumber
$?
adalah$CHILD_STATUS
system
kembalifalse
jika perintah memiliki kode keluar bukan nol, ataunil
jika tidak ada perintah.Karena itu
atau
harus berfungsi, dan cukup ringkas.
sumber
Anda tidak menangkap hasil
system
panggilan Anda , yang merupakan kode hasil dikembalikan:Ingat setiap
system
panggilan atau yang setara, yang menyertakan metode backtick, memunculkan shell baru, jadi tidak mungkin untuk menangkap hasil dari lingkungan shell sebelumnya. Dalam hal iniexit_code
adalahtrue
jika semuanya berhasil,nil
sebaliknya.The
popen3
perintah menyediakan lebih rendah tingkat rinci.sumber
Open3.capture3
adalah metode yang sangat mudah digunakan untuk tugas semacam ini.Salah satu cara untuk melakukannya adalah dengan merantai mereka menggunakan
and
atau&&
:Panggilan kedua tidak akan dijalankan jika yang pertama gagal.
Anda dapat membungkusnya
if ()
untuk memberi Anda kontrol aliran:sumber