système
La system
mé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
, STDOUT
et des STDERR
objets de votre programme Ruby. En fait, la valeur de retour réelle est soit true
, false
soit nil
. Dans l'exemple, la date a été imprimée via l'objet IO de STDIN
. La méthode sera renvoyée true
si le processus s'est terminé avec un état zéro, false
si le processus s'est terminé avec un état différent de zéro et nil
si l'exécution a échoué.
Un autre effet secondaire est que la variable globale $?
est définie sur un Process::Status
objet. 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 %x
est une alternative au style des backticks. Il renverra également la sortie. Comme ses proches %w
et %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 %x
peuvent utiliser l'interpolation de chaînes.
exec
En utilisant Kernel#exec
le 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.popen3
utile:
require 'open3'
Open3.popen3("curl http://example.com") do |stdin, stdout, stderr, thread|
pid = thread.pid
puts stdout.read.chomp
end