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 PATH
variable de entorno (solo foo
). Además, los detalles de la ejecución pueden complicar las cosas, ya que foo | bar | zot
requiere 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 foo
es 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 comenSIGINT
cuando 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
).
strace
o 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.