Quelle est la différence entre les méthodes Ruby suivantes?
exec
, system
Et %x()
ou contre - apostrophes
Je sais qu'ils sont utilisés pour exécuter des commandes de terminal par programmation via Ruby, mais j'aimerais savoir pourquoi il existe trois façons différentes de le faire.
sh
.Réponses:
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:Le programme appelé utilisera le courant
STDIN
,STDOUT
et desSTDERR
objets de votre programme Ruby. En fait, la valeur de retour réelle est soittrue
,false
soitnil
. Dans l'exemple, la date a été imprimée via l'objet IO deSTDIN
. La méthode sera renvoyéetrue
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 etnil
si l'exécution a échoué.Un autre effet secondaire est que la variable globale
$?
est définie sur unProcess::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.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.
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é viaexec
. 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:la source
STDIN
,STDOUT
,STDERR
, pensez à laOpen3.popen3
place; par exemple, voir stackoverflow.com/a/10922097/258662Voici un organigramme basé sur cette réponse . Voir aussi, utiliser
script
pour émuler un terminal .la source
Ils font des choses différentes.
exec
remplace le processus actuel par le nouveau processus et ne revient jamais .system
appelle un autre processus et renvoie sa valeur de sortie au processus en cours. L'utilisation de raccourcis appelle un autre processus et renvoie la sortie de ce processus au processus en cours.la source