Niektóre z powodów, dla których OP stwierdził, że opcje są nieodpowiednie, nie mają podstaw w rzeczywistości. Tutaj pokazuję, jakie efekty ma strategia OP 4:
W większości dystrybucji grepjest instalowany w /bin(typowy) lub /usr/bin(OpenSUSE, może inne) i domyślnie PATHzawiera /usr/local/binprzed /binlub /usr/bin. Oznacza to, że jeśli tworzysz za /usr/local/bin/greppomocą
#!/bin/sh
exec /bin/grep --color=auto "$@"
gdzie /bin/shjest powłoka kompatybilna z POSIX dostarczana przez twoją dystrybucję, zwykle bash lub dash. Jeśli grepjest /usr/bin, to zrób to
#!/bin/sh
exec /usr/bin/grep --color=auto "$@"
Narzut tego skryptu jest minimalny. Te execśrodki oświadczenie, że interpreter skryptu jest zastąpione przez grepbinarnej; oznacza to, że powłoka nie pozostaje w pamięci podczas grepwykonywania. Zatem jedynym narzutem jest jedno dodatkowe wykonanie interpretera skryptu, tj. Małe opóźnienie w czasie zegara ściennego. Opóźnienie jest mniej więcej stała (zależy tylko od tego, czy grepi shjuż są w pamięci podręcznej stron, czy nie, i na ile I / O przepustowość jest dostępna), a nie zależy od tego, jak długo grepbędzie wykonywał lub jak dużo danych przetwarza.
Jak długo to opóźnienie, tj. Narzut dodany przez skrypt opakowania?
Aby się dowiedzieć, utwórz powyższy skrypt i uruchom
time /bin/grep --version
time /usr/local/bin/grep --version
Na mojej maszynie pierwsza trwa 0,005 s w czasie rzeczywistym (w dużej liczbie przebiegów), podczas gdy druga trwa 0,006 s w czasie rzeczywistym. W związku z tym narzut związany z użyciem opakowania na mojej maszynie wynosi 0,001 s (lub mniej) na wywołanie.
To jest nieistotne.
Nie widzę też w tym nic „brudnego”, ponieważ wiele popularnych aplikacji i narzędzi używa tego samego podejścia. Aby zobaczyć listę takich na swoim komputerze w /bini /usr/bin, po prostu uruchom
file /bin/* /usr/bin/* | sed -ne 's/:.*shell script.*$//p'
Na moim komputerze, powyższy wyjściowy zawiera egrep, fgrep, zgrep, which, 7z, chromium-browser, ldd, i xfig, którego używam dość często. Jeśli nie uważasz całej dystrybucji za „brudną” za poleganie na skryptach opakowujących, nie masz powodu, aby uważać takie skrypty opakowujące za „brudne”.
Jeśli chodzi o problemy, taki skrypt opakowania może powodować:
Jeśli tylko użytkownicy człowieka (w przeciwieństwie do skryptów) używasz wersji grep że domyślnie wsparcia koloru jeśli wyjście jest do terminala, a następnie skrypt banderola może być nazwany colorgreplub cgrepczy cokolwiek PO uważa za stosowne.
Pozwala to uniknąć wszystkich możliwych problemów ze zgodnością, ponieważ zachowanie grepsię nie zmienia.
Włączanie grepopcji za pomocą skryptu opakowania, ale w sposób pozwalający uniknąć nowych problemów:
Możemy łatwo przepisać skrypt opakowania, aby obsługiwał niestandardowy, GREP_OPTSnawet jeśli GREP_OPTIONSnie był obsługiwany (ponieważ jest już przestarzały). W ten sposób użytkownicy mogą po prostu dodać export "GREP_OPTIONS=--color=auto"lub podobny profil. /usr/local/bin/grepjest wtedy
#!/bin/sh
exec /bin/grep $GREP_OPTIONS "$@"
Zauważ, że nie ma żadnych cudzysłowów $GREP_OPTIONS, więc użytkownicy mogą określić więcej niż jedną opcję.
W moim systemie wykonywanie time /usr/local/bin/grep --versionz GREP_OPTIONSpustym lub z GREP_OPTIONS=--color=autojest tak samo szybkie, jak poprzednia wersja skryptu opakowania; tzn. zwykle zajmuje jedną milisekundę dłużej niż zwykły grep.
Ta ostatnia wersja jest tą, którą osobiście polecam do użytku.
Podsumowując, strategia OP 4:
jest zalecany przez grepprogramistów
jest prosty do wdrożenia (dwie linie)
ma nieznaczny narzut (dodatkowe milisekundowe opóźnienie na wywołanie na tym konkretnym laptopie; łatwe do zweryfikowania na każdym komputerze)
może być zaimplementowany jako skrypt otoki, który dodaje GREP_OPTSobsługę (zastępuje przestarzałe / nieobsługiwane GREP_OPTIONS)
można zaimplementować (jako colorgrep/ cgrep), co nie wpływa na skrypty ani istniejących użytkowników
Ponieważ jest to technika, która jest już powszechnie stosowana w dystrybucjach Linuksa, jest to technika powszechna, a nie „brudna”.
Jeśli zostanie zaimplementowany jako osobne opakowanie ( colorgrep/ cgrep), nie może tworzyć nowych problemów, ponieważ w ogóle nie wpływa na grepzachowanie. Jeśli zostanie zaimplementowany jako skrypt otoki, który dodaje GREP_OPTSobsługę, użycie GREP_OPTS=--color=automa dokładnie takie samo ryzyko (problemy z istniejącymi skryptami), jak w przypadku dodawania domyślnego --color=auto. Zatem komentarz, że „stwarza więcej problemów niż rozwiązuje” jest całkowicie niepoprawny: nie powstają dodatkowe problemy.