Järjestelmäkomentojen suorittaminen Rubysta

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ä?

Vastaa

Sähköpostiosoitettasi ei julkaista.