section - Cuándo usar cada método de lanzar un subproceso en Ruby
wbr tag in html5 (3)
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á.
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 comoexec
(comparar la salida delsystem "echo *"
y elsystem "echo", "*"
)El sistema bloquea hasta que el subproceso haya salido.
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" }
scriptsfork { exec "bash" }
.fork
es tu amigo si quieres demonizar tu programa.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 con2>&1
si le importa.popen3
le proporciona un descriptor de archivo separado para el error estándar (para cuando necesita capturarlo por separado de la salida estándar)PTY.spawn
es necesario cuando quieres que el programa generado se comporte como si estuvieras ejecutando desde el terminal. Ver la diferencia delgrep --color=auto pat file
cuando se genera consystem
vsPTY.spawn
1. ``
El Backtick
- definido en Kernel
1. a) %x{}
Porcentaje X <sintaxis alternativa para The Backtick
- definido en parse.y, ver discussion
2. system()
3. fork()
4. open()
- abrir un tubo
- Kernel#open
4.a. IO.popen()
<se comporta igual que open()
- abrir un tubo
- IO#popen
4.b. open("|-")
- tenedor a un tubo
4.c. IO.popen("-")
<se comporta igual que open("|-")
- tenedor a un tubo
- ver discussion
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.