64 votes

Quand utiliser chaque méthode de lancement d'un sous-processus en Ruby

1. `` Le Backtick

1. a) %x{} Pourcentage X < syntaxe alternative pour The Backtick

2. system()

3. fork()

4. open()

4.a. IO.popen() < se comporte de la même manière que open()

4.b. open("|-")

  • fourche à un tuyau

4.c. IO.popen("-") < se comporte de la même manière que open("|-")

5. Open3.popen3()

  • require 'open3'
  • stdlib Open3

6. PTY.spawn()

  • require 'pty'
  • stdlib PTY

7. Shell.transact()

  • require 'shell'
  • stdlib Shell

Quand doit-on abandonner la fidèle baguette arrière pour l'une des méthodes les plus complexes ?

Edit 1. Un grand merci à Avdi Grimm pour ses articles décrivant des exemples d'utilisation de chaque méthode : #1 (& Gist ) ; #2 (& Gist ) ; #3 .

Ce sont des ressources fantastiques pour répondre Comment mais ne sont pas explicitement composés pour répondre quand chacun doit être utilisé o Pourquoi et, à ce titre, ne constituent pas des réponses complètes à cette question.

58voto

cam Points 8882
  1. Utilisez les backticks lorsque vous souhaitez capturer facilement la sortie d'un programme dans une variable. Vous ne devez probablement utiliser cette méthode que pour les programmes de courte durée, car elle peut bloquer.

  2. system est pratique dans deux cas différents :

    a. Vous avez un programme qui s'exécute sur une longue période et vous voulez que la sortie s'imprime au fur et à mesure de son exécution (par ex. system("tar zxvf some_big_tarball.tar.gz") )

    b. system peut contourner l'expansion du shell comme exec (comparez la sortie de system "echo *" y system "echo", "*" )

    Le système bloque jusqu'à ce que le sous-processus ait quitté.

  3. fork a également quelques cas d'utilisation différents :

    a. Vous voulez exécuter du code ruby dans un processus séparé (par exemple fork { .... }

    b. Vous voulez exécuter un processus enfant (ou un programme différent) sans bloquer la progression de votre script. fork { exec "bash" } .

    fork est votre ami si vous voulez démoniser votre programme.

  4. IO.popen est utile lorsque vous devez interagir avec la sortie et l'entrée standard d'un programme. Notez qu'elle ne capture pas le standard err, vous devez donc le rediriger avec la commande 2>&1 si vous vous souciez de cela.

  5. popen3 vous donne un descripteur de fichier séparé pour l'erreur standard (pour les cas où vous avez besoin de la capturer séparément de la sortie standard)

  6. PTY.spawn est nécessaire lorsque vous voulez que le programme créé se comporte comme si vous l'exécutiez depuis le terminal. Voir la différence entre grep --color=auto pat file lorsqu'il est frayé avec system vs PTY.spawn

48voto

Ian Points 216

Voici un organigramme basé sur cette réponse . Voir aussi, en utilisant script pour émuler un terminal .

enter image description here

9voto

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