Ruby Language Méthodes recommandées pour exécuter le code shell en Ruby:


Exemple

Open3.popen3 ou Open3.capture3:
Open3 utilise en fait simplement la commande spawn de Ruby, mais vous offre une API bien meilleure.

Open3.popen3

Popen3 s'exécute dans un sous-processus et renvoie stdin, stdout, stderr et wait_thr.

require 'open3'
stdin, stdout, stderr, wait_thr = Open3.popen3("sleep 5s && ls")
puts "#{stdout.read} #{stderr.read} #{wait_thr.value.exitstatus}"

ou

require 'open3'
cmd = 'git push heroku master'
Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
  puts "stdout is:" + stdout.read
  puts "stderr is:" + stderr.read
end

va sortir: stdout est: stderr est: fatal: Pas un dépôt git (ou l'un des répertoires parents): .git

ou

require 'open3'
cmd = 'ping www.google.com'
Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
  while line = stdout.gets
    puts line
  end
end

va sortir:

En cliquant sur www.google.com [216.58.223.36] avec 32 octets de données:
Réponse de 216.58.223.36: octets = 32 fois = 16ms TTL = 54
Réponse de 216.58.223.36: octets = 32 fois = 10ms TTL = 54
Réponse de 216.58.223.36: octets = 32 heure = 21ms TTL = 54
Réponse de 216.58.223.36: octets = 32 fois = 29ms TTL = 54
Statistiques de ping pour 216.58.223.36:
Paquets: Envoyé = 4, Reçu = 4, Perdu = 0 (perte de 0%),
Temps d'aller-retour approximatifs en milli-secondes:
Minimum = 10ms, Maximum = 29ms, Moyenne = 19ms


Open3.capture3:

require 'open3'

stdout, stderr, status = Open3.capture3('my_funky_command', 'and', 'some', 'argumants')
if status.success?
  # command completed successfully, do some more stuff
else
  raise "An error occured"
end

ou

Open3.capture3('/some/binary with some args')  

Non recommandé en raison des frais généraux supplémentaires et du potentiel d'injection de coquille.

Si la commande lit à partir de stdin et que vous voulez lui donner des données:

Open3.capture3('my_funky_command', stdin_data: 'read from stdin')  

Exécutez la commande avec un répertoire de travail différent, en utilisant chdir:

Open3.capture3('my_funky_command', chdir: '/some/directory')