grep不一致默认为grep -P?

我有一个脚本,当从交互式shell调用时,它可以完美地工作,但是在被cron调用时什么也不做。 为了解决这个问题,我使用以下命令启动了一个带有“空白”环境的shell:

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

使用这个空白的env我挖了我的脚本,发现下面的grep将不匹配任何文件:

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

但是,从交互式shell运行时,该命令将返回匹配文件的文件名。

注意,expression式是匹配的行如: WS_STATUS = "remove"

通过反复试验,我发现在选项[Perl regex]中join-P ,命令开始在'空白'shell中正常工作。 但是,我不知道为什么我的loginshell似乎默认为grep -P

  • 只有一个grep二进制文件/bin/grep
  • 没有为grep=pgrepgrep="grep -P"定义别名
  • 没有定义envvariablesGREP_OPTIONS

这里的交易是什么?

注意:OS是RHEL v5.10,Bash是v3.2.25,grep是v2.5.1

这些variables中的任何一个是?

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

它们中的任何一个都可能会影响grep的行为。

你可能会尝试的一件事是“设置-x”来查看运行的单个命令。 你也可以将这些命令移动到shell脚本中,并从cron中调用它。 这样你就可以更容易地添加像setenvset -x这样的命令。

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