Некоторые из причин, по которым OP указала, что варианты являются неподходящими, не имеют под собой реальной основы. Здесь я покажу, какие эффекты использует стратегия 4 OP:
В большинстве дистрибутивов grepустанавливается в /bin(обычный) или /usr/bin(OpenSUSE, может быть, в другие), и по умолчанию PATHсодержит /usr/local/binдо /binили /usr/bin. Это означает, что если вы создаете /usr/local/bin/grepс
#!/bin/sh
exec /bin/grep --color=auto "$@"
где /bin/shPOSIX-совместимая оболочка, предоставляемая вашим дистрибутивом, обычно bash или dash. Если grepесть /usr/bin, то сделайте это
#!/bin/sh
exec /usr/bin/grep --color=auto "$@"
Накладные расходы этого скрипта минимальны. Это execутверждение означает, что интерпретатор сценария заменяется grepдвоичным; это означает, что оболочка не остается в памяти во grepвремя выполнения. Таким образом, единственные накладные расходы - это одно дополнительное выполнение интерпретатора сценария, то есть небольшая задержка во времени настенных часов. Задержка примерно постоянной (изменяется только в зависимости от того , grepи shуже в кэше страницы или нет, и от того, как полоса пропускания много ввода / вывода доступна), и не зависит от того, как долго grepисполняет или сколько данных он обрабатывает.
Итак, как долго эта задержка, то есть накладные расходы, добавленные сценарием оболочки?
Чтобы выяснить это, создайте приведенный выше скрипт и запустите
time /bin/grep --version
time /usr/local/bin/grep --version
На моей машине первый занимает 0,005 с в реальном времени (при большом количестве прогонов), тогда как второй занимает 0,006 с в реальном времени. Таким образом, накладные расходы на использование оболочки на моей машине составляют 0,001 с (или меньше) за вызов.
Это незначительно.
Я также не вижу ничего «грязного» в этом, потому что многие обычные приложения и утилиты используют один и тот же подход. Чтобы увидеть список таких на вашей машине в /binи /usr/bin, просто запустите
file /bin/* /usr/bin/* | sed -ne 's/:.*shell script.*$//p'
На моей машине выше выход включает в себя egrep, fgrep, zgrep, which, 7z, chromium-browser, ldd, и xfig, которые я использую довольно часто. Если вы не считаете весь свой дистрибутив «грязным» для использования сценариев-оболочек, у вас нет оснований считать такие сценарии-оболочки «грязными».
Что касается проблем, такой скрипт-обертка может вызвать:
Если только человеческие пользователи (в отличие от скриптов) используют версию Grep , что по умолчанию цвета поддержки , если выход является на терминал, то сценарий обертка может быть именем colorgrepили cgrepили независимо от того, что ОП считает нужным.
Это позволяет избежать всех возможных проблем совместимости, поскольку поведение grepне изменяется вообще.
Включение grepпараметров с помощью сценария-оболочки, но таким образом, чтобы избежать каких-либо новых проблем:
Мы можем легко переписать скрипт-обертку для поддержки пользовательского, GREP_OPTSдаже если он GREP_OPTIONSне поддерживается (так как он уже устарел). Таким образом, пользователи могут просто добавить export "GREP_OPTIONS=--color=auto"свой профиль или подобный ему. /usr/local/bin/grepзатем
#!/bin/sh
exec /bin/grep $GREP_OPTIONS "$@"
Обратите внимание, что вокруг нет кавычек $GREP_OPTIONS, поэтому пользователи могут указать более одного параметра.
В моей системе выполнение time /usr/local/bin/grep --versionс GREP_OPTIONSпустым или с GREP_OPTIONS=--color=autoтаким же быстрым выполнением, как и в предыдущей версии сценария оболочки; т.е. обычно выполняется на одну миллисекунду дольше, чем обычный grep.
Это последняя версия, которую я лично рекомендую для использования.
Таким образом, стратегия ОП 4:
рекомендуется grepразработчикам
тривиально реализовать (две строки)
имеет незначительные накладные расходы (дополнительная задержка в одну миллисекунду на вызов на этом конкретном ноутбуке; легко проверяется на каждой машине)
может быть реализован в виде скрипта-обёртки, который добавляет GREP_OPTSподдержку (вместо устаревшего / неподдерживаемого GREP_OPTIONS)
может быть реализован (как colorgrep/ cgrep), который не затрагивает сценарии или существующих пользователей вообще
Поскольку этот метод уже широко используется в дистрибутивах Linux, это обычный метод, а не «грязный».
Если он реализован как отдельная оболочка ( colorgrep/ cgrep), он не может создавать новые проблемы, так как он вообще не влияет на grepповедение. При реализации в виде сценария-обертки, который добавляет GREP_OPTSподдержку, использование GREP_OPTS=--color=autoимеет те же риски (по сравнению с существующими сценариями), что и при добавлении по умолчанию в исходной версии --color=auto. Таким образом, комментарий о том, что это «создает больше проблем, чем решает», совершенно неверен: никаких дополнительных проблем не создается.