Cum se execută comenzi de sistem din Ruby

Dacă doriți să executați o comandă externă din Ruby…

…cum ar fi wkhtmltopdf pentru a converti un fișier HTML în PDF.

Există câteva metode Ruby pe care le puteți folosi.

În funcție de metoda pe care o folosiți veți obține rezultate diferite.

Să explorăm împreună aceste metode!

Metoda de sistem Ruby

Metoda de sistem Ruby este cel mai simplu mod de a rula o comandă externă.

Acesta arată astfel:

system("ls")

Observați că system va imprima ieșirea comenzii pe măsură ce are loc.

De asemenea, sistemul va face ca programul Ruby să aștepte până când comanda se termină.

Încercați acest lucru:

system("sleep 2")

Există modalități de a rula comenzi în fundal, așa cum vom vedea mai târziu.

Sistemul poate returna 3 valori posibile:

  • true dacă comanda a funcționat
  • false dacă comanda returnează un cod de eroare
  • nil dacă executarea comenzii eșuează (comanda nu a fost găsită)

Puteți obține codul de stare de ieșire al ultimei comenzi externe pe care ați executat-o cu variabila globală $?. Acest cod de stare vă poate oferi mai multe informații despre motivul pentru care comanda a eșuat.

Ce este expansiunea shell-ului?

Când executați o comandă externă cu system veți obține efectul de „expansiune a shell-ului”.

Expansiunea shell-ului este atunci când shell-ul (sh/bash/zsh) ia câteva caractere speciale (*, ? și ")# "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 sau metoda Kernel#`.

Acestea fac același lucru.

Iată un exemplu:

`ls`

Un altul cu %x:

%x|ls|

Aceste două exemple vor returna un șir de caractere cu ieșirea comenzii ls.

Rețineți că tot trebuie să așteptați terminarea comenzii dacă nu o executați în interiorul unui fir de execuție.

Cum să folosiți Fork + Exec pentru a rula comenzi externe pe un proces separat

Forking face o copie a procesului curent (aplicația Ruby), apoi puteți înlocui acea copie cu un alt proces folosind exec.

Notă: Metoda fork nu este disponibilă pe Windows.

Aceasta este o schemă populară în lumea Unix.

Iată cum funcționează:

fork { exec("ls") }

Aceasta va rula ls pe un alt proces & și va afișa ieșirea acestuia.

Pentru că această comandă rulează într-un alt proces, nu va bloca rularea aplicației dvs. Ruby ca metoda system sau %x.

Important:

Dacă folosiți exec fără fork veți înlocui procesul dvs. curent.

Acest lucru înseamnă că programul dvs. Ruby se va încheia.

Cum se utilizează metoda Popen pentru comunicarea bidirecțională cu un program extern

Dacă aveți nevoie de:

  • Control mai mare asupra procesului
  • Comunicare bidirecțională

Atunci metoda IO.popen este ceea ce căutați.

În exemplul următor folosesc metoda popen pentru a lansa un proces irb, apoi îi trimit niște intrări & și citesc ieșirea.

Iată exemplul:

r = IO.popen("irb", "r+")r.write "puts 123 + 1\n"3.times { puts r.gets }r.write "exit\n"

Această r variabilă r este un obiect IO, ceea ce înseamnă că puteți scrie & citi din ea ca un fișier obișnuit.

Utilizarea popen înseamnă, de asemenea, că comanda dvs. externă va rula pe propriul proces, astfel încât nu trebuie să o executați pe un fir de execuție.

Există, de asemenea, o metodă popen3 în biblioteca standard.

Diferența față de popen obișnuită este că aceasta va împărți mesajele de eroare de ieșire obișnuită & în obiecte IO separate.

Concluzie

Ați învățat despre diferitele moduri în care puteți interacționa cu comenzi externe în Ruby.

Aveți grijă cu acestea!

Nu treceți nici un fel de intrare a utilizatorului în aceste comenzi decât dacă doriți o problemă de securitate în aplicația dumneavoastră Ruby.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.