1177 votes

L'Appel De Commandes Bash De Ruby

Comment dois-je appeler la console/bash commandes à partir de l'intérieur d'un Rubis Programme? Aussi, comment puis-je obtenir la sortie de ces commandes dans mon programme?

1417voto

Steve Willard Points 5985

Cette explication est basée sur ce commenté Ruby script à partir d'un de mes amis. Si vous voulez améliorer le script, n'hésitez pas à mettre à jour le lien.

Des moyens pour exécuter un script shell

cmd = "echo 'hi'" # Sample string that can be used

1. Kernel#`, communément appelé backticks – `cmd`

C'est comme beaucoup d'autres langues, y compris Bash, PHP et Perl

Retourne le résultat de la commande shell

Docs: http://ruby-doc.org/core/Kernel.html#method-i-60

value = `echo 'hi'`
value = `#{cmd}`

2. Construit-dans la syntaxe, %x( cmd )

À la suite de la x personnage est un séparateur, qui peut être n'importe quel caractère. Si le délimiteur est l'un des personnages (, [, {ou <, le littéral se compose des caractères jusqu'à la fermeture correspondant séparateur, en tenant compte de imbriquée délimiteur de paires. Pour tous les autres délimiteurs, les littéral comprend les caractères jusqu'à la prochaine occurrence de la caractère délimiteur. Chaîne d'interpolation #{ ... } est autorisée.

Retourne le résultat de la commande shell, tout comme les backticks

Docs: http://www.ruby-doc.org/docs/ProgrammingRuby/html/language.html

value = %x( echo 'hi' )
value = %x[ #{cmd} ]

3. Kernel#system

Exécute la commande dans un shell interne est exécuté,

Retour: vrai si la commande a été trouvé et a couru avec succès, false sinon

Docs: http://ruby-doc.org/core/Kernel.html#method-i-system

wasGood = system( "echo 'hi'" )
wasGood = system( cmd )

4. Kernel#exec

Remplace le processus en cours en exécutant la commande externe.

Retour: aucun, le processus actuel est remplacé et ne jamais se poursuit

Docs: http://ruby-doc.org/core/Kernel.html#method-i-exec

exec( "echo 'hi'" )
exec( cmd ) # Note: this will never be reached beacuse of the line above

Conseils Supplémentaires

$?, ce qui est la même que $CHILD_STATUS, accède au statut de la dernière système de commande en cours d'exécution si vous utilisez les backticks, system() ou %{}. Vous pouvez alors accéder à l' exitstatus et pid propriétés

$?.exitstatus

Plus De Lecture

164voto

cynicalman Points 4391

La façon dont je l'aime pour ce faire est l'aide de l' %x littérale, ce qui le rend facile (et lisible!) utiliser des guillemets dans une commande, comme suit:

directorylist = %x[find . -name '*test.rb' | sort]

Qui, dans ce cas, remplissez la liste de fichier avec tous les fichiers de test dans le répertoire courant, vous pouvez le traiter comme prévu:

directorylist.each do |filename|
  filename.chomp!
  # work with file
end

66voto

Mihai A Points 1192

Voici le meilleur article dans mon avis sur l'exécution de scripts en Ruby: "6 Façons d'Exécuter des Commandes Shell en Ruby".

Si vous avez seulement besoin d'obtenir la sortie à utiliser backticks.

J'avais besoin de plus avancé des trucs comme STDOUT et STDERR j'ai donc utilisé le Open4 gem. Vous disposez de tous les méthodes décrites.

43voto

anshul Points 2964

Mon préféré est Open3

  require "open3"

  Open3.popen3('nroff -man') { |stdin, stdout, stderr| ... }

30voto

Nick Brosnahan Points 1043

Quelques choses à penser lors du choix entre ces mécanismes sont les suivants:

  1. Voulez-vous simplement stdout ou avez-vous besoin stderr? ou même séparés?
  2. Quelle est la taille de votre sortie? Voulez-vous pour que l'ensemble du résultat en mémoire?
  3. Voulez-vous lire certaines de vos sortie tandis que le sous-processus est encore en cours d'exécution?
  4. Avez-vous besoin des codes de résultat?
  5. Avez-vous besoin d'un rubis objet représente le processus et vous permet de le tuer à la demande?

Vous mai besoin de quelque chose de simple backticks (`), system(), andIO.popento full-blownNoyau.fourche/Noyau.execwithIO.pipeandIO.sélectionnez`.

Vous pouvez également vouloir jeter des délais d'attente dans le mélange, si un sous-processus prend trop de temps à exécuter.

Malheureusement, beaucoup dépend.

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