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

  • so in your interactive shell, which grep returns grep -P? Did you do a recursive grep for "grep -P" in /etc/profile*?
    – Petter H
    Oct 24, 2013 at 18:23
  • @PetterH which grep returns /bin/grep, and grep -ri grep /etc/profile* only prints out a few uses of it in the scripts.
    – Sammitch
    Oct 24, 2013 at 18:49
  • Rather than which grep can you try type grep. Oct 24, 2013 at 19:29
  • @MarkWagner grep is hashed (/bin/grep)
    – Sammitch
    Oct 24, 2013 at 20:18
  • 1
    I don't have enough rep to comment, but does it help if you use \grep with a backslash, instead of grep? I know you already said that it wasn't aliased, but in the off chance that it is, this should use an unaliased grep. Jun 16, 2014 at 10:46

1 Answer 1


Are any of these variables et?


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.

echo SET
echo ENV
set -x
grep -il "^ws_status\s*=\s*[\"']remove[\"']$"

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.