Ubuntu – Is GREP_OPTIONS= –color=always ignored

greplessUbuntu

I was playing around with setting GREP_OPTIONS and couldn't get it to work. Just curious as to why.

Simple test commands output:

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. The 1st grep outputs to the terminal in color (each 'o' is red)
  2. The 2nd grep outputs via less in color (same as 1)
  3. But the 3rd grep outputs to less but in black & white – but this should be in color.

So it appears that grep is ignoring GREP_OPTIONS. Is that a bug or am I doing something wrong?

(Ubuntu 12.04.2, GNU grep 2.10)

Best Answer

If grep o produces color output, then either grep is an alias to grep --color=auto or grep --color=always (or possibly more options), or GREP_OPTIONS is set to a value that contains --color=auto or --color=always. Since $GREP_OPTIONS is empty, it must be the alias.

Since grep o | less -R doesn't show colors, the alias must be to grep --color=auto (a sensible choice). With the alias, the grep command always receives the --color option on the command line, and this takes precedence over the environment variable.

If you want to use the environment variable, remove the alias definition from your ~/.bashrc, or for one session run unalias grep. You can replace alias grep='grep --color=auto' by export GREP_OPTIONS='--color=auto': they have essentially the same meaning, except that:

  • setting GREP_OPTIONS to a different value only overrides the latter;
  • the alias only kicks in when you run grep from an interactive shell, whereas setting GREP_OPTIONS also applies when grep is run from scripts and other applications.

Never put --color=always or most other options in GREP_OPTIONS: it would break many programs that parse the output of grep. --color=auto is about the only safe option to put in GREP_OPTIONS. For anything else, use the alias. Future versions of GNU grep will drop support for the option for this reason.

Note that the alias definition goes into ~/.bashrc (it's a shell setting), whereas the environment variable definition goes into ~/.profile (it's a session setting). See Is there a ".bashrc" equivalent file read by all shells?

If you want to run the unaliased command just once, run \grep instead of grep (quoting any part of the name bypasses the alias lookup).