Wird GREP_OPTIONS = --color = immer ignoriert?

8

Ich spielte mit dem Setting herum GREP_OPTIONSund konnte es nicht zum Laufen bringen. Ich bin nur neugierig, warum.

Einfache Ausgabe von Testbefehlen:

richard@ubuntu:~$ echo $GREP_OPTIONS

richard@ubuntu:~$ 

richard@ubuntu:~$ ls | grep o 
Desktop
downloads
Dropbox
ebooks
workspace

richard@ubuntu:~$ ls | grep o --color=always | less -R 

richard@ubuntu:~$ export GREP_OPTIONS="--color=always" 
richard@ubuntu:~$ ls | grep o  | less -R 
  1. Der erste grep wird farbig an das Terminal ausgegeben (jedes 'o' ist rot)
  2. Der 2. grep gibt über weniger Farbe aus (wie 1)
  3. Aber der 3. grep gibt weniger aus, aber in Schwarzweiß - aber dies sollte in Farbe sein.

Es scheint also, dass grep ignoriert GREP_OPTIONS. Ist das ein Fehler oder mache ich etwas falsch?

(Ubuntu 12.04.2, GNU grep 2.10)

Richard
quelle
grep v3.1beschwert sich lautstark über GREP_OPTIONSjeden Aufruf:grep: warning: GREP_OPTIONS is deprecated; please use an alias or script
Tom Hale
Ich benutze: alias grep='GREP_COLOR="1;33;40" LANG=C grep --color=auto'zum Hervorheben in gelb.
Tom Hale

Antworten:

11

Wenn grep oeine Farbausgabe erzeugt wird, handelt es sich entweder grepum einen Alias ​​für grep --color=autooder grep --color=always(oder möglicherweise um mehrere Optionen) oder GREP_OPTIONSum einen Wert, der --color=autooder enthält --color=always. Da $GREP_OPTIONSes leer ist, muss es der Alias ​​sein.

Da grep o | less -Rkeine Farben angezeigt werden, muss der Alias ​​zu grep --color=auto(eine sinnvolle Wahl) sein. Mit dem Alias greperhält der Befehl immer die --colorOption in der Befehlszeile, und dies hat Vorrang vor der Umgebungsvariablen.

Wenn Sie die Umgebungsvariable verwenden möchten, entfernen Sie die Aliasdefinition aus Ihrem ~/.bashrcoder für einen Sitzungslauf unalias grep. Sie können ersetzen alias grep='grep --color=auto'durch export GREP_OPTIONS='--color=auto': Sie haben im Wesentlichen die gleiche Bedeutung, außer dass:

  • Das Setzen GREP_OPTIONSauf einen anderen Wert überschreibt nur den letzteren.
  • Der Alias ​​wird nur aktiviert, wenn Sie grepüber eine interaktive Shell ausgeführt werden. Die Einstellung GREP_OPTIONSgilt auch, wenn grepsie über Skripts und andere Anwendungen ausgeführt wird.

Niemals --color=alwaysoder die meisten anderen Optionen eingeben GREP_OPTIONS: Es würde viele Programme beschädigen, die die Ausgabe von analysieren grep. --color=autoist über die einzig sichere Option zu setzen GREP_OPTIONS. Verwenden Sie für alles andere den Alias. Zukünftige Versionen von GNU grep werden aus diesem Grund die Unterstützung für die Option einstellen.

Beachten Sie, dass die Aliasdefinition in ~/.bashrc(es ist eine Shell-Einstellung), während die Umgebungsvariablendefinition in ~/.profile(es ist eine Sitzungseinstellung) eingeht. Siehe Gibt es eine „Bashrc“ entsprechende Datei von allen Schalen lesen?

Wenn Sie den Befehl ohne Alias ​​nur einmal ausführen möchten, führen Sie ihn \grepstattdessen aus grep( wenn Sie einen beliebigen Teil des Namens angeben, wird die Alias-Suche umgangen).

Gilles 'SO - hör auf böse zu sein'
quelle
Ja, Sie haben Recht, wenn Sie \ grep ... ausführen, wird dies korrekt angezeigt. Vielen Dank für den Bonus-Tipp, dass Sie mir davon abgeraten haben, "= always" in .bashrc zu verwenden. +1
Richard
1
Bitte beachten Sie, dass dies GREP_OPTIONSzugunsten der aliasVariante veraltet ist .
user369450