Bueno, la secuencia exacta puede variar, ya que puede haber un alias o función de shell que primero se expande / interpreta antes de que se ejecute el programa real, y luego las diferencias para un nombre de archivo calificado ( /usr/libexec/foo) frente a algo que se buscará en todos los directorios de la PATHvariable de entorno (solo foo). Además, los detalles de la ejecución pueden complicar las cosas, ya que foo | bar | zotrequiere más trabajo para el shell (cierto número de fork(2), dup(2)y, por supuesto pipe(2), entre otras llamadas al sistema), mientras que algo así exec fooes mucho menos trabajo ya que el shell simplemente se reemplaza con el nuevo programa (es decir, no lo hace fork). También son importantes los grupos de procesos (especialmente el grupo de procesos en primer plano, todos los PID que comenSIGINTcuando alguien comienza a mezclar en Ctrl+ C, sesiones, y si el trabajo se ejecutará en segundo plano, monitoreado ( foo &) o en segundo plano, ignorado ( foo & disown). Los detalles de redirección de E / S también cambiarán las cosas, por ejemplo, si el shell ( foo <&-) cierra la entrada estándar o si un archivo se abre como stdin ( foo < blah).
straceo similar será informativo sobre las llamadas específicas del sistema realizadas a lo largo de este proceso, y debe haber páginas de manual para cada una de esas llamadas. La lectura adecuada a nivel de sistema sería cualquier número de capítulos de "Programación avanzada en el entorno UNIX" de Stevens, mientras que un libro de shell (por ejemplo, "De Bash a Z Shell") cubrirá el lado de shell de las cosas con más detalle.