Цель этого вопроса - ответить на любопытство, а не решить конкретную вычислительную проблему. Вопрос заключается в следующем: почему обязательные утилиты POSIX обычно не встроены в реализации оболочки?
Например, у меня есть сценарий, который в основном считывает несколько небольших текстовых файлов и проверяет, правильно ли они отформатированы, но для запуска на моем компьютере требуется 27 секунд из-за значительного количества операций со строками. Эта строковая манипуляция создает тысячи новых процессов, вызывая различные утилиты, отсюда и медлительность. Я довольно уверен , что если некоторые утилиты были построены, а именно grep
, sed
, cut
, tr
, и expr
, то скрипт будет работать в секунду или меньше ( на основе моего опыта в C).
Кажется, что было бы много ситуаций, в которых сборка этих утилит имела бы разницу между тем, имеет ли решение в сценарии оболочки приемлемую производительность.
Очевидно, что была причина, по которой было выбрано не делать эти утилиты встроенными. Возможно, наличие одной версии утилиты на системном уровне позволяет избежать использования нескольких неравных версий этой утилиты различными оболочками. Я действительно не могу придумать много других причин, чтобы нести накладные расходы на создание такого количества новых процессов, и POSIX достаточно определяет утилиты, так что не кажется большой проблемой иметь разные реализации, при условии, что они являются POSIX. совместимый. По крайней мере, не такая большая проблема, как неэффективность наличия такого количества процессов.
printf
и т. Д.), Были включены в оболочки, когда они считались достаточно полезными.
awk
обязательная утилита в POSIX, и особенно хорошо подходит (то есть, очень быстро) для реализации сценариев , которые вы могли бы реализовать с помощью sed
, cut
, tr
, grep
и expr
в сценарии оболочки.