Почему обязательные утилиты POSIX не встроены в оболочку?
Поскольку для соответствия POSIX требуется система 1 для предоставления большинства утилит как отдельные команды.
Наличие их в оболочке означало бы, что они должны существовать в двух разных местах: внутри оболочки и вне ее. Конечно, можно было бы реализовать внешнюю версию, используя оболочку сценария оболочки для встроенной, но это поставило бы в невыгодное положение приложения, не являющиеся оболочкой, вызывающие утилиты.
Обратите внимание, что BusyBox пошел по предложенному вами пути, реализовав множество команд внутри и предоставив автономный вариант с использованием ссылок на самого себя. Одна проблема заключается в том, что хотя набор команд может быть довольно большим, реализации часто являются подмножеством стандарта, поэтому не соответствуют требованиям.
Также обратите внимание, что по крайней мере
ksh93
,bash
иzsh
идут дальше, предоставляя настраиваемые методы для запущенной оболочки для динамической загрузки встроенных функций из разделяемых библиотек.Технически тогда ничто не мешает реализовать все утилиты POSIX и сделать их доступными как встроенные.Наконец, создание новых процессов стало довольно быстрой операцией в современных операционных системах. Если вы действительно столкнулись с проблемой производительности, возможно, есть некоторые улучшения, чтобы ваши скрипты работали быстрее.
Однако все стандартные утилиты , включая обычные встроенные в таблицу, но не специальные встроенные ins, описанные в Специальные встроенные утилиты, , должны быть реализованы таким образом, чтобы к ним можно было получить доступ через семейство функций exec , как определено в {{1} } том Системные интерфейсы POSIX.1-2008, и может быть вызван непосредственно теми стандартными утилитами, которые в нем нуждаются (env, find, nice, nohup, time, xargs).