94 votes

Exécution de commandes en ligne de commande dans le script Ruby

Existe-t-il un moyen d'exécuter des commandes en ligne de commande via Ruby? J'essaie de créer un petit programme Ruby qui composerait un numéro et recevrait / enverrait des programmes en ligne de commande tels que 'screen', 'rcsz', etc.

Ce serait formidable si je pouvais relier tout cela à Ruby (serveur MySQL, etc.)

215voto

Adrian Points 5816

Oui. Il existe plusieurs manières:

un. Utiliser %x ou""':

%x(echo hi) #=> "hi\n"
%x(echo hi >&2) #=> "" (prints 'hi' to stderr)

`echo hi` #=> "hi\n"
`echo hi >&2` #=> "" (prints 'hi' to stderr)

Ces méthodes sera de retour le stdout, et de rediriger stderr du programme.

b. Utiliser system:

system 'echo hi' #=> true (prints 'hi')
system 'echo hi >&2' #=> true (prints 'hi' to stderr)
system 'exit 1' #=> nil

Cette méthode retourne true si la commande a réussi. Il redirige toutes les sorties du programme.

c. Utiliser exec:

fork { exec 'sleep 60' } # you see a new process in top, "sleep", but no extra ruby process. 
exec 'echo hi' # prints 'hi'
# the code will never get here.

Qui remplace le processus actuel avec celui créé par la commande.

d. (ruby 1.9) utiliser spawn:

spawn 'sleep 1; echo one' #=> 430
spawn 'echo two' #=> 431
sleep 2
# This program will print "two\none".

Cette méthode ne permet pas d'attendre que le processus de sortie et retourne le PID.

e. Utiliser IO.popen:

io = IO.popen 'cat', 'r+'
$stdout = io
puts 'hi'
$stdout = IO.new 0
p io.read(1)
io.close
# prints '"h"'.

Cette méthode retourne un IO objet reperesents le nouveau processus d'entrée/sortie. Il est aussi actuellement le seul moyen que je connaisse pour vous donner le programme de saisie.

f. Utiliser Open3 (sur 1.9.2 et plus tard)

require 'open3'

stdout,stderr,status = Open3.capture3(some_command)
STDERR.puts stderr
if status.successful?
  puts stdout
else
  STDERR.puts "OH NO!"
end

Open3 a plusieurs autres fonctions pour obtenir un accès explicite à deux flux de sortie. Il est similaire à popen, mais vous donne accès à stderr.

14voto

Mark Rushakoff Points 97350

Il existe plusieurs façons d’exécuter des commandes système dans Ruby.

 irb(main):003:0> `date /t` # surround with backticks
=> "Thu 07/01/2010 \n"
irb(main):004:0> system("date /t") # system command (returns true/false)
Thu 07/01/2010
=> true
irb(main):005:0> %x{date /t} # %x{} wrapper
=> "Thu 07/01/2010 \n"
 

Mais si vous devez réellement effectuer des entrées et des sorties avec les commandes stdin / stdout de la commande, vous voudrez probablement vous intéresser à la méthode IO::popen , qui propose spécifiquement cette fonctionnalité.

7voto

ohho Points 17243
 folder = "/"
 list_all_files = "ls -al #{folder}"
 output = `#{list_all_files}`
 puts output

2voto

Steve Weet Points 15395

Oui, c'est certainement faisable, mais la méthode de la mise en œuvre diffère dépend de savoir si la "ligne de commande" programme en question fonctionne en "Plein écran" ou en mode ligne de commande. Les programmes écrits pour la ligne de commande ont tendance à lire STDIN et d'écrire sur la sortie standard STDOUT. Ceux-ci peuvent être appelés directement à l'intérieur de Ruby en utilisant le standard de backticks méthodes et/ou système/exec appels.

Si le programme fonctionne en mode "Plein Écran", comme l'écran ou vi, alors l'approche doit être différente. Pour ce genre de programmes que vous devriez regarder pour un Rubis de mise en œuvre de "s'attendre à" de la bibliothèque. Cela vous permettra de faire un script de ce que vous vous attendez à voir sur l'écran et ce à envoyer lorsque vous voyez l'un de ces chaînes apparaissent sur l'écran.

C'est rare d'être la meilleure approche, et vous devriez probablement regarder ce que vous essayez d'atteindre et trouver la bibliothèque en question/gem pour le faire plutôt que d'essayer d'automatiser un existant plein écran de l'application. Comme un exemple "Besoin d'aide avec le port série de communication en Ruby" traite avec le Port Série de communication, un pré-curseur à la numérotation, si c'est ce que vous voulez réaliser à l'aide de programmes spécifiques que vous avez mentionné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X