système
La systemméthode appelle un programme système. Vous devez fournir la commande comme argument de chaîne à cette méthode. Par exemple:
>> system("date")
Wed Sep 4 22:03:44 CEST 2013
=> true
Le programme appelé utilisera le courant STDIN, STDOUTet des STDERRobjets de votre programme Ruby. En fait, la valeur de retour réelle est soit true, falsesoit nil. Dans l'exemple, la date a été imprimée via l'objet IO de STDIN. La méthode sera renvoyée truesi le processus s'est terminé avec un état zéro, falsesi le processus s'est terminé avec un état différent de zéro et nilsi l'exécution a échoué.
Un autre effet secondaire est que la variable globale $?est définie sur un Process::Statusobjet. Cet objet contiendra des informations sur l'appel lui-même, y compris l'identificateur de processus (PID) du processus appelé et l'état de sortie.
>> system("date")
Wed Sep 4 22:11:02 CEST 2013
=> true
>> $?
=> #<Process::Status: pid 15470 exit 0>
Coups de poing
Les backticks (``) appellent un programme système et renvoient sa sortie. Contrairement à la première approche, la commande n'est pas fournie via une chaîne, mais en la plaçant dans une paire de backticks.
>> `date`
=> Wed Sep 4 22:22:51 CEST 2013
La variable globale $?est également définie via les backticks. Avec les backticks, vous pouvez également utiliser l'interpolation de chaînes.
%X()
L'utilisation %xest une alternative au style des backticks. Il renverra également la sortie. Comme ses proches %wet %q(entre autres), tout délimiteur suffira tant que les délimiteurs de style support correspondent. Ce moyen %x(date), %x{date}et %x-date-sont tous synonymes. Comme les backticks %xpeuvent utiliser l'interpolation de chaînes.
exec
En utilisant Kernel#execle processus actuel (votre script Ruby) est remplacé par le processus appelé via exec. La méthode peut prendre une chaîne comme argument. Dans ce cas, la chaîne sera soumise à une expansion du shell. Lorsque vous utilisez plusieurs arguments, le premier est utilisé pour exécuter un programme et les éléments suivants sont fournis en tant qu'arguments au programme à appeler.
Open3.popen3
Parfois, les informations requises sont écrites sur une entrée standard ou une erreur standard et vous devez également les contrôler. Voici Open3.popen3utile:
require 'open3'
Open3.popen3("curl http://example.com") do |stdin, stdout, stderr, thread|
pid = thread.pid
puts stdout.read.chomp
end