5

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 '13 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 '13 at 18:49
  • Rather than which grep can you try type grep. – Mark Wagner Oct 24 '13 at 19:29
  • @MarkWagner grep is hashed (/bin/grep) – Sammitch Oct 24 '13 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. – sinisterstuf Jun 16 '14 at 10:46
2

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
|improve this answer|||||

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.