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
$GREP_OPTIONS is empty, it must be the alias.
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:
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.
--color=always or most other options in
GREP_OPTIONS: it would break many programs that parse the output of
--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).