Einige der Gründe, aus denen OP angegeben hat, dass die Optionen ungeeignet sind, haben in der Realität keine Grundlage. Hier zeige ich, welche Auswirkungen die Strategie 4 von OP hat:
Wird bei den meisten Distributionen grep
in /bin
(typisch) oder /usr/bin
(OpenSUSE, möglicherweise in anderen) installiert und PATH
enthält standardmäßig /usr/local/bin
vor /bin
oder /usr/bin
. Dies bedeutet , dass , wenn Sie erstellen /usr/local/bin/grep
mit
#!/bin/sh
exec /bin/grep --color=auto "$@"
Wo /bin/sh
ist eine POSIX-kompatible Shell, die von Ihrer Distribution bereitgestellt wird, normalerweise Bash oder Dash. Wenn drin grep
ist /usr/bin
, dann mach das
#!/bin/sh
exec /usr/bin/grep --color=auto "$@"
Der Overhead dieses Skripts ist minimal. Die exec
Anweisung bedeutet, dass der Skriptinterpreter durch die grep
Binärdatei ersetzt wird. Dies bedeutet, dass die Shell während grep
der Ausführung nicht im Speicher verbleibt . Somit ist der einzige Overhead eine zusätzliche Ausführung des Skriptinterpreters, dh eine kleine Latenz in der Wanduhrzeit. Die Latenz ist ungefähr konstant (hängt nur davon ab, ob grep
und sh
sich bereits im Seitencache befinden oder nicht und wie viel E / A-Bandbreite verfügbar ist) und hängt nicht davon ab, wie lange sie grep
ausgeführt wird oder wie viele Daten verarbeitet werden.
Wie lange dauert diese Latenz, dh der vom Wrapper-Skript hinzugefügte Overhead?
Um dies herauszufinden, erstellen Sie das obige Skript und führen Sie es aus
time /bin/grep --version
time /usr/local/bin/grep --version
Auf meinem Computer benötigt Ersteres 0,005 Sekunden in Echtzeit (über eine große Anzahl von Läufen), während Letzteres 0,006 Sekunden in Echtzeit benötigt. Daher beträgt der Aufwand für die Verwendung des Wrappers auf meinem Computer 0,001 s (oder weniger) pro Aufruf.
Das ist unbedeutend.
Ich sehe auch nichts "Schmutziges" daran, weil viele gängige Anwendungen und Dienstprogramme denselben Ansatz verwenden. Um die Liste solcher auf Ihrem Computer in /bin
und /usr/bin
anzuzeigen, führen Sie sie einfach aus
file /bin/* /usr/bin/* | sed -ne 's/:.*shell script.*$//p'
Auf meinem Rechner enthält die obige Ausgabe egrep
, fgrep
, zgrep
, which
, 7z
, chromium-browser
, ldd
, und xfig
, das ich ziemlich oft. Wenn Sie Ihre gesamte Distribution nicht als "schmutzig" betrachten, weil Sie sich auf Wrapper-Skripte verlassen, haben Sie keinen Grund, solche Wrapper-Skripte als "schmutzig" zu betrachten.
Bei Problemen kann ein solches Wrapper-Skript Folgendes verursachen:
Wenn nur menschliche Benutzer (im Gegensatz zu Skripten gegen) werden mit der Version von grep , dass standardmäßig Farbunterstützung , wenn Ausgabe an einen Terminal ist, dann kann der Wrapper - Skript benannt werden colorgrep
oder cgrep
oder was auch immer der OP sieht fit.
Dies vermeidet alle möglichen Kompatibilitätsprobleme, da sich das Verhalten von grep
überhaupt nicht ändert.
Aktivieren von grep
Optionen mit einem Wrapper-Skript, jedoch auf eine Weise, die neue Probleme vermeidet:
Wir können das Wrapper-Skript einfach umschreiben, um eine benutzerdefinierte Datei zu unterstützen, GREP_OPTS
auch wenn GREP_OPTIONS
sie nicht unterstützt wird (da sie bereits veraltet ist). Auf diese Weise können Benutzer einfach export "GREP_OPTIONS=--color=auto"
oder ähnlich zu ihrem Profil hinzufügen . /usr/local/bin/grep
ist dann
#!/bin/sh
exec /bin/grep $GREP_OPTIONS "$@"
Beachten Sie, dass keine Anführungszeichen vorhanden sind $GREP_OPTIONS
, sodass Benutzer mehr als eine Option angeben können.
Auf meinem System ist die Ausführung time /usr/local/bin/grep --version
mit GREP_OPTIONS
leer oder mit GREP_OPTIONS=--color=auto
genauso schnell wie in der vorherigen Version des Wrapper-Skripts. Das heißt, die Ausführung dauert normalerweise eine Millisekunde länger als normal grep
.
Diese letzte Version würde ich persönlich zur Verwendung empfehlen.
Zusammenfassend die Strategie 4 von OP:
wird bereits von grep
Entwicklern empfohlen
ist trivial zu implementieren (zwei Zeilen)
hat einen unbedeutenden Overhead (eine Millisekunde zusätzliche Latenz pro Aufruf auf diesem bestimmten Laptop; auf jedem Computer leicht zu überprüfen)
kann als Wrapper-Skript implementiert werden, das GREP_OPTS
Unterstützung hinzufügt (um veraltete / nicht unterstützte zu ersetzen GREP_OPTIONS
)
kann implementiert werden (als colorgrep
/ cgrep
), ohne dass Skripte oder vorhandene Benutzer betroffen sind
Da es sich um eine Technik handelt, die bereits in Linux-Distributionen weit verbreitet ist, handelt es sich um eine gängige Technik, die nicht "schmutzig" ist.
Wenn es als separater Wrapper ( colorgrep
/ cgrep
) implementiert wird , kann es keine neuen Probleme verursachen, da es das grep
Verhalten überhaupt nicht beeinflusst . Wenn es als Wrapper-Skript implementiert wird, das GREP_OPTS
Unterstützung hinzufügt , GREP_OPTS=--color=auto
birgt die Verwendung genau die gleichen Risiken (z. B. Probleme mit vorhandenen Skripten) wie das vorgelagerte Hinzufügen von Standard --color=auto
. Daher ist der Kommentar, dass dies "mehr Probleme schafft als löst", völlig falsch: Es werden keine zusätzlichen Probleme erstellt.