Ну, точная последовательность может отличаться, так как может быть псевдоним оболочки или функция, которая сначала раскрывается / интерпретируется перед выполнением фактической программы, а затем различия для определенного имени файла ( /usr/libexec/foo) по сравнению с чем-то, что будет просматриваться во всех каталогах. из PATHпеременной окружения (только foo). Кроме того , детали исполнения могут осложнить ситуацию, поскольку foo | bar | zotтребует больше работы для оболочки (некоторое количество fork(2), dup(2)и, конечно же , pipe(2)среди других системных вызовов), в то время как что - то вроде exec fooгораздо меньше работы , как оболочка просто заменяет себя новая программа (то есть, это не так fork). Также важны группы процессов (особенно группа процессов переднего плана, все PID которыхSIGINTкогда кто-то начинает затираться в Ctrl+ C, сессиях, и будет ли задание выполняться в фоновом режиме, monitored ( foo &) или background, ignored ( foo & disown). Детали перенаправления ввода / вывода также изменят ситуацию, например, если стандартный ввод закрывается shell ( foo <&-), или файл открывается как stdin ( foo < blah).
straceили подобное будет информативным о конкретных системных вызовах, выполняемых в ходе этого процесса, и для каждого из этих вызовов должны быть страницы руководства. Подходящим чтением на уровне системы будет любое количество глав из «Расширенного программирования в среде UNIX» Стивенса, в то время как книга оболочек (например, «От Bash до Z Shell») будет более подробно освещать аспекты оболочки.