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?
Réponses
Trop de publicités?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
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
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.
Quelques choses à penser lors du choix entre ces mécanismes sont les suivants:
- Voulez-vous simplement stdout ou avez-vous besoin stderr? ou même séparés?
- Quelle est la taille de votre sortie? Voulez-vous pour que l'ensemble du résultat en mémoire?
- Voulez-vous lire certaines de vos sortie tandis que le sous-processus est encore en cours d'exécution?
- Avez-vous besoin des codes de résultat?
- 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(), and
IO.popento full-blown
Noyau.fourche/
Noyau.execwith
IO.pipeand
IO.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.