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 grep
jest instalowany w /bin
(typowy) lub /usr/bin
(OpenSUSE, może inne) i domyślnie PATH
zawiera /usr/local/bin
przed /bin
lub /usr/bin
. Oznacza to, że jeśli tworzysz za /usr/local/bin/grep
pomocą
#!/bin/sh
exec /bin/grep --color=auto "$@"
gdzie /bin/sh
jest powłoka kompatybilna z POSIX dostarczana przez twoją dystrybucję, zwykle bash lub dash. Jeśli grep
jest /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 grep
binarnej; oznacza to, że powłoka nie pozostaje w pamięci podczas grep
wykonywania. 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 grep
i sh
już 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 grep
bę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 /bin
i /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 colorgrep
lub cgrep
czy cokolwiek PO uważa za stosowne.
Pozwala to uniknąć wszystkich możliwych problemów ze zgodnością, ponieważ zachowanie grep
się nie zmienia.
Włączanie grep
opcji 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_OPTS
nawet jeśli GREP_OPTIONS
nie 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/grep
jest 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 --version
z GREP_OPTIONS
pustym lub z GREP_OPTIONS=--color=auto
jest 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 grep
programistó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_OPTS
obsł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 grep
zachowanie. Jeśli zostanie zaimplementowany jako skrypt otoki, który dodaje GREP_OPTS
obsługę, użycie GREP_OPTS=--color=auto
ma 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.