Existe-t-il un moyen d'exécuter des commandes de ligne de commande via Ruby? J'essaie de créer un petit programme Ruby qui composerait et recevrait / enverrait via des programmes de ligne de commande comme 'screen', 'rcsz', etc.
Ce serait formidable si je pouvais lier tout cela avec Ruby (backend MySQL, etc.)
Réponses:
Oui. Il existe plusieurs manières:
une. Utilisez
%x
ou '' ':Ces méthodes renverront le stdout et redirigeront stderr vers le programme.
b. Utilisez
system
:Cette méthode retourne
true
si la commande a réussi. Il redirige toute la sortie vers le programme.c. Utilisez
exec
:Cela remplace le processus actuel par celui créé par la commande.
ré. (ruby 1.9) utiliser
spawn
:Cette méthode n'attend pas que le processus se termine et renvoie le PID.
e. Utilisez
IO.popen
:Cette méthode retournera un
IO
objet qui représente l'entrée / sortie des nouveaux processus. C'est aussi actuellement le seul moyen que je connaisse pour donner une contribution au programme.F. Utiliser
Open3
(sur 1.9.2 et versions ultérieures)Open3
a plusieurs autres fonctions pour obtenir un accès explicite aux deux flux de sortie. C'est similaire à popen, mais vous donne accès à stderr.la source
io = IO.popen 'cat > out.log', 'r+'
; écrit les sorties de la commande dans "out.log"FileUtils
[ ruby-doc.org/stdlib-1.9.3/libdoc/fileutils/rdoc/FileUtils.html] ?Il existe plusieurs façons d'exécuter des commandes système dans Ruby.
Mais si vous devez réellement effectuer une entrée et une sortie avec la commande stdin / stdout, vous voudrez probablement regarder la
IO::popen
méthode, qui offre spécifiquement cette fonctionnalité.la source
la source
Oui, c'est certainement faisable mais la méthode de mise en œuvre diffère selon que le programme "ligne de commande" en question fonctionne en mode "plein écran" ou en ligne de commande. Les programmes écrits pour la ligne de commande ont tendance à lire STDIN et à écrire dans STDOUT. Ceux-ci peuvent être appelés directement dans Ruby en utilisant les méthodes standard de backticks et / ou les appels système / exec.
Si le programme fonctionne en mode "Plein écran" comme screen ou vi, alors l'approche doit être différente. Pour des programmes comme celui-ci, vous devriez rechercher une implémentation Ruby de la bibliothèque "expect". Cela vous permettra de créer un script de ce que vous vous attendez à voir à l'écran et de ce qu'il faut envoyer lorsque vous voyez ces chaînes particulières apparaître à l'écran.
Il est peu probable que ce soit la meilleure approche et vous devriez probablement regarder ce que vous essayez d'atteindre et trouver la bibliothèque / gemme appropriée pour le faire plutôt que d'essayer d'automatiser une application plein écran existante. À titre d'exemple, « Besoin d'aide pour les communications du port série dans Ruby » traite des communications du port série, un précurseur à la numérotation si c'est ce que vous voulez réaliser en utilisant les programmes spécifiques que vous avez mentionnés.
la source
La méthode la plus utilisée utilise
Open3
ici est ma version éditée par le code du code ci-dessus avec quelques corrections:la source