Apa perbedaan antara metode Ruby berikut?
exec
, system
dan %x()
atau Backticks
Saya tahu mereka digunakan untuk menjalankan perintah terminal secara pemrograman melalui Ruby, tetapi saya ingin tahu mengapa ada tiga cara berbeda untuk melakukan ini.
sh
.Jawaban:
sistem
The
system
pemanggilan metode program sistem. Anda harus memberikan perintah sebagai argumen string untuk metode ini. Sebagai contoh:Program yang dipanggil akan menggunakan objek saat ini
STDIN
,STDOUT
danSTDERR
objek dari program Ruby Anda. Bahkan, nilai pengembalian aktualnya adalahtrue
,false
ataunil
. Dalam contoh tanggal dicetak melalui objek IO dariSTDIN
. Metode akan kembalitrue
jika proses keluar dengan status nol,false
jika proses keluar dengan status tidak-nol dannil
jika eksekusi gagal.Efek samping lain adalah bahwa variabel global
$?
diatur keProcess::Status
objek. Objek ini akan berisi informasi tentang panggilan itu sendiri, termasuk pengidentifikasi proses (PID) dari proses yang dipanggil dan status keluar.Backticks
Backticks (``) memanggil program sistem dan mengembalikan hasilnya. Berbeda dengan pendekatan pertama, perintah tidak diberikan melalui string, tetapi dengan meletakkannya di dalam pasangan backticks.
Variabel global
$?
diatur melalui backticks juga. Dengan backticks Anda juga dapat menggunakan interpolasi string.% x ()
Menggunakan
%x
adalah alternatif dari gaya backticks. Ini akan mengembalikan output juga. Seperti kerabatnya%w
dan%q
(antara lain), pembatas apa pun akan mencukupi selama pembatas braket cocok. Ini berarti%x(date)
,%x{date}
dan%x-date-
semuanya adalah sinonim. Seperti backticks%x
dapat menggunakan interpolasi string.eksekutif
Dengan menggunakan
Kernel#exec
proses saat ini (skrip Ruby Anda) diganti dengan proses yang dimintaexec
. Metode ini dapat mengambil string sebagai argumen. Dalam hal ini string akan mengalami ekspansi shell. Ketika menggunakan lebih dari satu argumen, maka yang pertama digunakan untuk menjalankan suatu program dan berikut ini disediakan sebagai argumen untuk program yang akan dipanggil.Open3.popen3
Terkadang informasi yang diperlukan ditulis ke input standar atau kesalahan standar dan Anda perlu mengontrolnya juga. Ini
Open3.popen3
berguna:sumber
STDIN
,STDOUT
,STDERR
, pertimbangkanOpen3.popen3
bukan; mis. lihat stackoverflow.com/a/10922097/258662Berikut bagan alur berdasarkan jawaban ini . Lihat juga, gunakan
script
untuk meniru terminal .sumber
Mereka melakukan hal yang berbeda.
exec
mengganti proses saat ini dengan proses baru dan tidak pernah kembali .system
meminta proses lain dan mengembalikan nilai keluarnya ke proses saat ini. Menggunakan backticks memanggil proses lain dan mengembalikan output dari proses itu ke proses saat ini.sumber