Некоторые из причин, по которым 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/sh
POSIX-совместимая оболочка, предоставляемая вашим дистрибутивом, обычно 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
. Таким образом, комментарий о том, что это «создает больше проблем, чем решает», совершенно неверен: никаких дополнительных проблем не создается.