Ksh93 делает многое, чтобы избежать развилок. Я понятия не имею, откуда он знает, как обрабатывать первый случай, поскольку truss
показывает, что он вызывает только один вызов write(2)
с конечным результатом.
Возможно, Дэвид сканирует команду в macro.c и знает, что он может обрабатывать "echo" внутренне.
Что я могу сказать, так это то, что я переписал парсер и интерпретатор "Bourne Shell" в прошлом году и в основном уменьшил количество форков и заменил многие форки вызовами vfork()
. В настоящее время Bourne Shell является второй по скорости оболочкой после ksh93. Возможно, вы захотите запустить свои тесты с bosh
.
BTW: ksh93 вообще избегает форков. Он реализует структуру, которая содержит все предыдущие глобальные переменные, что делает код оболочки реентерабельным, если он вызывается с разными экземплярами указателя структуры "глобальных" переменных.
Этот метод используется в ksh93 всякий раз, когда есть (cmd)
под-оболочка.
Причина этого переписывания в том, что Дэвид использует Win-DOS на своем ноутбуке, и ему не понравился медленный Cygwin, поэтому он написал UWIN и использует ksh93 на Win-DOS напрямую. Поскольку в Win-DOS нет fork()
, ему нужно было найти новое решение...