tag section script samp bootstrap 3school ruby performance coding-style standards subprocess

section - Cuándo usar cada método de lanzar un subproceso en Ruby



wbr tag in html5 (3)

  1. use backticks cuando quiera capturar fácilmente la salida de un programa en una variable. Es probable que solo quiera usar esto para programas de ejecución corta, porque esto bloqueará.

  2. system es conveniente en dos casos diferentes:

    a. Tiene un programa de larga ejecución y desea que la salida se imprima a medida que se ejecuta (por ejemplo, el system("tar zxvf some_big_tarball.tar.gz") )

    segundo. system puede omitir la expansión de shell como exec (comparar la salida del system "echo *" y el system "echo", "*" )

    El sistema bloquea hasta que el subproceso haya salido.

  3. fork tiene un par de casos de uso diferentes también:

    a. Desea ejecutar un código ruby ​​en un proceso separado (por ejemplo, fork { .... }

    segundo. Desea ejecutar un proceso secundario (o un programa diferente) sin bloquear el progreso de su fork { exec "bash" } scripts fork { exec "bash" } .

    fork es tu amigo si quieres demonizar tu programa.

  4. IO.popen es útil cuando necesita interactuar con la salida estándar y estándar de un programa. Tenga en cuenta que no captura el error estándar, por lo que necesita redirigirlo con 2>&1 si le importa.

  5. popen3 le proporciona un descriptor de archivo separado para el error estándar (para cuando necesita capturarlo por separado de la salida estándar)

  6. PTY.spawn es necesario cuando quieres que el programa generado se comporte como si estuvieras ejecutando desde el terminal. Ver la diferencia del grep --color=auto pat file cuando se genera con system vs PTY.spawn

1. `` El Backtick

1. a) %x{} Porcentaje X <sintaxis alternativa para The Backtick

2. system()

3. fork()

4. open()

4.a. IO.popen() <se comporta igual que open()

4.b. open("|-")

  • tenedor a un tubo

4.c. IO.popen("-") <se comporta igual que open("|-")

5. Open3.popen3()

  • require ''open3''
  • stdlib Open3

6. PTY.spawn()

  • require ''pty''
  • stdlib PTY

7. Shell.transact()

  • require ''shell''
  • Shell estándar

¿Cuándo debería uno abandonar el confiable back-tick para uno de los métodos más complejos?

Edit 1. Muchas gracias a Avdi Grimm por sus publicaciones que describen el uso de ejemplo de cada método: #1 (& gist ); #2 (& gist ); #3 .

Son recursos fantásticos para responder cómo , pero no están explícitamente compuestos para responder cuándo se debe usar cada uno o por qué , y como tal, IMHO no son respuestas completas a esta pregunta.


Aquí hay un diagrama de flujo basado en esta respuesta . Ver también, usando script para emular un terminal .


Echa un vistazo a esta serie de artículos: