Appel de commandes shell depuis Ruby

Comment puis-je appeler des commandes shell depuis l'intérieur d'un programme Ruby ? Comment puis-je récupérer la sortie de ces commandes dans Ruby ?

请先 登录 后评论

3 réponses

Rufo Sanchez

Vous pouvez également utiliser les opérateurs backtick (`), similaires à Perl :

directoryListing = `ls /`
puts directoryListing # prints the contents of the root directory

Pratique si vous avez besoin de quelque chose de simple.

La méthode que vous souhaitez utiliser dépend exactement de ce que vous essayez d'accomplir ; consultez la documentation pour plus de détails sur les différentes méthodes.

请先 登录 后评论
cynicalman

La façon dont j'aime faire cela est d'utiliser le littéral %x, ce qui rend facile (et lisible !) l'utilisation de guillemets dans une commande, comme ceci :

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

Qui, dans ce cas, remplira la liste des fichiers avec tous les fichiers de test sous le répertoire actuel, que vous pouvez traiter comme prévu :

directorylist.each do |filename|
  filename.chomp!
  # work with file
end
请先 登录 后评论
Nick Brosnahan

Certaines choses auxquelles il faut penser lors du choix entre ces mécanismes sont :

  1. Voulez-vous juste stdout ou voulez-vous besoin de stderr aussi? ou même séparés ?
  2. Quelle est la taille de votre production ? Est-ce que tu veux conserver tout le résultat en mémoire ?
  3. Voulez-vous lire certains de vos sortie alors que le sous-processus est toujours en cours d'exécution ?
  4. Avez-vous besoin de codes de résultat ?
  5. Avez-vous besoin d'un objet ruby ​​qui représente le processus et vous permet le tuer à la demande ?

Vous pouvez avoir besoin de n'importe quoi, des simples backticks (``), system() et IO.popen au complet Kernel.fork/Kernel.exec avec IO.pipe et IO.select.

Vous pouvez également ajouter des délais d'attente au mixage si un sous-processus prend trop de temps à s'exécuter.

Malheureusement, cela dépend.

请先 登录 后评论