Quiero entender que ¿cómo funciona el intérprete de órdenes ejecutado? p.ej. gato | Más. Soy consciente de que para ejecutar un shell de comando normal hace un tenedor, lo ejecuta y luego vuelve el niño. Pero, ¿cómo maneja internamente el shell la ejecución de los comandos canalizados?¿Cómo ejecuta Shell los comandos canalizados?
Respuesta
Teniendo en cuenta por ejemplo cat | grep
, la cáscara primeros sí horquillas para iniciar cat
, y luego horquillas sí mismo una vez más para iniciar grep
.
Antes de llamar a una de las exec*
familias de funciones en los dos procesos recién creados para iniciar los dos programas, la parte difícil es configurar la tubería y redirigir los descriptores. La llamada al sistema pipe(2)
se utiliza en el proceso de shell antes de bifurcar para devolver un par de descriptores que ambos hijos heredan: un final de lectura y un final de escritura.
El final de lectura se cerrará en el primer proceso (cat
) y stdout se redireccionará al final de escritura mediante la llamada al sistema dup2(2)
. De forma similar, el final de escritura en el segundo proceso (grep
) se cerrará y stdin se redireccionará al final de lectura nuevamente usando dup2(2)
.
De esta manera, ambos programas desconocen la existencia de una tubería porque solo funcionan con la entrada/salida estándar.
Configura una tubería usando la llamada al sistema pipe
, bifurca dos procesos en lugar de uno y conecta un extremo del conducto al primer proceso 'stdout y el otro extremo al segundo proceso' stdin.
¿Puede explicar cómo unirse a stdout de un proceso con stdin de otro? – cppdev
@cppdev: usando 'dup2', pero ya has descubierto la respuesta de Blagovest. @Downvoter: ¿Qué pasa con esta respuesta, excepto que es demasiado corta? –
Lo mismo, solo el stdout de una aplicación es el mismo que el stdin siguiente. http://unixwiz.net/techtips/remap-pipe-fds.html
- 1. Enviando SIGINT desde el teclado a comandos canalizados en bash
- 2. Cómo combinar comandos de shell
- 3. Cómo utilizar los comandos de shell en el Makefile
- 4. ¿Qué son los comandos incorporados en shell en Linux?
- 5. Obtener $ USER dentro de la secuencia de comandos de shell cuando se ejecuta con sudo?
- 6. ¿Ejecuta la línea de comandos desde C# con los parámetros?
- 7. Groovy ejecutando comandos de shell
- 8. En una secuencia de comandos de shell: comandos echo shell como se ejecutan
- 9. Cómo matar todos los subprocesos de shell?
- 10. Ejecutando comandos de shell desde Java
- 11. Guardia ejecuta scripts de shell dos veces
- 12. Ejecución de comandos de shell sin una ventana de shell
- 13. ¿Cómo ejecutar comandos de shell desde una aplicación Mac/MacRuby?
- 14. scripts shell/batch para dirigir comandos al shell adb
- 15. Ejecuta dos comandos durante la ejecución de git bisect
- 16. Múltiples comandos a través de Jsch Shell
- 17. Detección del script shell que se ejecuta en Cygwin
- 18. Scala - comandos de shell con tubería
- 19. Comandos de Emacs y Shell largos
- 20. Ejecutando comandos de shell desde Scala REPL
- 21. Comandos de escape de shell en java?
- 22. ¿Puede Ruby acceder a la salida desde los comandos del shell tal como aparece?
- 23. Cómo ejecutar comandos de shell de forma síncrona en PHP
- 24. script de shell que no se ejecuta mediante crontab, se ejecuta correctamente manualmente
- 25. Shell de comandos que empiezan por ">"
- 26. secuencia de comandos de shell autodetectable
- 27. ejecutan los scripts de shell en C++
- 28. Múltiples comandos en la máquina remota usando script de shell
- 29. ¿Cómo se ejecutan los procesos canalizados con bash en múltiples núcleos?
- 30. ¿Cómo borro el historial de comandos en el shell mongodb?
Hola Blagovest, estoy un poco confundido. ¿Es grep un niño de gato o un niño de concha? ¿Cómo sabe el gato que tiene que pasar por grep? – cppdev
Tienes razón, bash en particular no crearía el segundo proceso como hijo del primero, pero el principio aún se cumple y ambos procesos siguen siendo hijos del caparazón. –