Jos haluat suorittaa ulkoisen komennon Rubysta…
…kuten wkhtmltopdf:n, jolla muunnat HTML-tiedoston PDF:ksi.
Voit käyttää muutamaa Ruby-menetelmää.
Käyttämästäsi metodista riippuen saat erilaisia tuloksia.
Tutustutaan näihin menetelmiin yhdessä!
Rubyn järjestelmämenetelmä
Rubyn järjestelmämenetelmä on yksinkertaisin tapa suorittaa ulkoinen komento.
Se näyttää tältä:
system("ls")
Huomaa, että system
tulostaa komennon ulostulon sitä mukaa kuin se tapahtuu.
Systeemi saa myös Ruby-ohjelmasi odottamaan, kunnes komento on valmis.
Kokeile tätä:
system("sleep 2")
On olemassa tapoja suorittaa komentoja taustalla, kuten näemme myöhemmin.
Järjestelmä voi palauttaa 3 mahdollista arvoa:
-
true
jos komento toimi -
false
jos komento palauttaa virhekoodin -
nil
jos komennon suoritus epäonnistuu (komentoa ei löydy)
Voit saada viimeisimmän ajamasi ulkoisen komennon poistumistilakoodin globaalin muuttujan $?
avulla. Tämä tilakoodi voi antaa sinulle lisätietoja siitä, miksi komento epäonnistui.
Mikä on komentotulkin laajennus?
Kun suoritat ulkoisen komennon komennolla system
, saat ”komentotulkin laajennus”-efektin.
Komentotulkin laajennus on sitä, kun komentotulkki (sh/bash/zsh) ottaa käyttöönsä joitain erikoismerkkejä (*
, ?
ja ")# "best"
This will not change the current environment of your Ruby application.
%x / Kernel#`
If you want to get the output from the command you're running, instead of displaying it then you can use %x
tai menetelmän Kernel#`
.
Ne tekevät saman asian.
Tässä on esimerkki:
`ls`
Toinen %x
:
%x|ls|
Nämä kaksi esimerkkiä palauttavat merkkijonon, jossa on komennon ls
tulosteet.
Huomaa, että joudut silti odottamaan komennon päättymistä, ellet suorita komentoa säikeen sisällä.
How to Use Fork + Exec To Run External Commands On a Separate Process
Forking tekee kopion nykyisestä prosessistasi (Ruby-sovelluksestasi), jonka jälkeen voit korvata tämän kopion toisella prosessilla käyttämällä exec:iä.
Huomioitavaa: Fork-menetelmä ei ole käytettävissä Windowsissa.
Tämä on suosittu malli Unix-maailmassa.
Näin se toimii:
fork { exec("ls") }
Tämä suorittaa ls
toisessa prosessissa &näyttää sen tulosteen.
Koska tämä komento suoritetaan jossakin toisessa prosessissa, se ei estä Ruby-sovellustasi toimimasta, kuten system
-menetelmä system
tai %x
.
Tärkeää:
Jos käytät exec
ilman fork
, se korvaa nykyisen prosessisi.
Tämä tarkoittaa, että Ruby-ohjelmasi päättyy.
How to Use the Popen Method For Two Way Communication With An External Program
Jos tarvitset:
- Lisää kontrollia prosessiin
- Kahdensuuntaista kommunikaatiota
Tällöin IO.popen
-metodi on se, mitä etsit.
Seuraavassa esimerkissä käytän popen-metodia käynnistääksesi irb
prosessin, sitten lähetän sille jonkin syötteen & ja luen tulosteen.
Tässä esimerkki:
r = IO.popen("irb", "r+")r.write "puts 123 + 1\n"3.times { puts r.gets }r.write "exit\n"
Tämä r
-muuttuja on IO-objekti, tämä tarkoittaa, että voit kirjoittaa & lukea siitä kuten tavallisesta tiedostosta.
popen
käyttäminen tarkoittaa myös sitä, että ulkoinen komentosi suoritetaan omassa prosessissaan, joten sinun ei tarvitse suorittaa sitä säikeessä.
Vakiokirjastossa on myös metodi popen3
.
Ero tavalliseen popen
on se, että se jakaa tavalliset ulostulon & virheilmoitukset erillisiin IO-objekteihin.
Johtopäätös
Olet oppinut eri tavoista, joilla voit olla vuorovaikutuksessa ulkoisten komentojen kanssa Rubyssä.
Ole varovainen näiden kanssa!
Älä välitä minkäänlaista käyttäjän syötettä näihin komentoihin, ellet halua tietoturvaongelmaa Ruby-sovellukseesi.
Mitä?