Деякі з причин, за якими ОП заявила, що варіанти є непридатними, насправді не мають підстав. Тут я показую, які ефекти за допомогою стратегії 4 ОП мають:
У більшості дистрибутивів 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 оболонка, надана вашим розповсюдженням, як правило, баш або тире. Якщо 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має точно такі ж ризики (wrt. Проблеми з існуючими сценаріями), що і для додавання за замовчуванням --color=auto. Таким чином, коментар, що це "створює більше проблем, ніж вирішує", є абсолютно невірним: додаткових проблем не створюється.