grep is inconsistently defaulting to grep -P?

I have a script that does some housekeeping that works perfectly well when invoked from an interactive shell, but did nothing when invoked by cron. To troubleshoot this I started a shell with a 'blank' environment with the command:

env -i /bin/bash --noprofile --norc

Using this blank env I've dug into my script and found that the following grep will not match any files:

grep -il "^ws_status\s*=\s*[\"']remove[\"']$"

However, when run from an interactive shell the command will return the filenames of the matching files.

As a note, the expression is matching lines like: WS_STATUS = "remove"

Through trial-and-error I discovered that adding -P to the options [Perl regex] the command started working normally in the 'blank' shell. However, I have no idea why my login shell appears to be defaulted to grep -P.

  • There is only one grep binary, /bin/grep
  • There are no aliases defined for grep=pgrep or grep="grep -P"
  • There is no env variable GREP_OPTIONS defined.

What's the deal here?

Note: OS is RHEL v5.10, Bash is v3.2.25, grep is v2.5.1


Solution 1:

Are any of these variables et?

GREP_OPTIONS, LC_ALL, LC_COLLATE, LANG, LC_CTYPE, LC_MESSAGES or POSIXLY_CORRECT

Any of them could affect grep's behavior.

One thing you might try is "set -x" to see the individual commands that get run. You might also move the commands into a shell script and call that from cron. That way you can more easily add commands like set, env, and set -x more easily.

#!/bin/bash
echo SET
set
echo ENV
env
set -x
grep -il "^ws_status\s*=\s*[\"']remove[\"']$"
exit