When you’re searching a set of version-controlled files for a string with
grep
, particularly if it’s a recursive search, it can get very annoying to be
presented with swathes of results from the internals of the hidden version
control directories like .svn
or .git
, or include metadata you’re unlikely
to have wanted in files like .gitmodules
.
GNU grep
uses an environment variable named GREP_OPTIONS
to define a set of
options that are always applied to every call to grep
. This comes in handy
when exported in your .bashrc
file to set a “standard” grep
environment for
your interactive shell. Here’s an example of a definition of GREP_OPTIONS
that excludes a lot of patterns which you’d very rarely if ever want to search
with grep
:
GREP_OPTIONS=
for pattern in .cvs .git .hg .svn; do
GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=$pattern
done
export GREP_OPTIONS
Note that --exclude-dir
is a relatively recent addition to the options for
GNU grep
, but it should only be missing on very legacy GNU/Linux machines by now.
If you want to keep your .bashrc
file compatible, you could apply a little
extra hackery to make sure the option is available before you set it up to be
used:
GREP_OPTIONS=
if grep --help | grep -- --exclude-dir &>/dev/null; then
for pattern in .cvs .git .hg .svn; do
GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=$pattern"
done
fi
export GREP_OPTIONS
Similarly, you can ignore single files with --exclude
. There’s also
--exclude-from=FILE
if your list of excluded patterns starts getting too
long.
Other useful options available in GNU grep
that you might wish to add to this
environment variable include:
--color
— On appropriate terminal types, highlight the pattern matches in output, among other color changes that make results more readable-s
— Suppresses error messages about files not existing or being unreadable; helps if you find this behaviour more annoying than useful.-E, -F, or -P
— Pick a favourite “mode” forgrep
; devotees of PCRE may find adding-P
forgrep
‘s experimental PCRE support makesgrep
behave in a much more pleasing way, even though it’s described in the manual as being experimental and incomplete
If you don’t want to use GREP_OPTIONS
, you could instead simply set up an
alias
:
alias grep='grep --exclude-dir=.git'
You may actually prefer this method as it’s essentially functionally
equivalent, but if you do it this way, when you want to call grep
without
your standard set of options, you only have to prepend a backslash to its call:
$ \grep pattern file
Commenter Andy Pearce also points out that using this method can avoid some
build problems where GREP_OPTIONS
would interfere.
Of course, you could solve a lot of these problems simply by using
ack
… but that’s another post.