Ну, точная последовательность может отличаться, так как может быть псевдоним оболочки или функция, которая сначала раскрывается / интерпретируется перед выполнением фактической программы, а затем различия для определенного имени файла ( /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») будет более подробно освещать аспекты оболочки.