grep 不一致地默认为 grep -P?

grep 不一致地默认为 grep -P?

我有一个脚本,它可以执行一些日常工作,当从交互式 shell 调用时,它可以很好地工作,但当通过 cron 调用时,它什么也不做。为了解决这个问题,我使用以下命令启动了一个具有“空白”环境的 shell:

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

使用这个空白环境,我深入研究了我的脚本,发现以下内容与grep任何文件都不匹配:

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

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

值得注意的是,该表达式匹配如下行:WS_STATUS = "remove"

通过反复试验,我发现将-P选项 [Perl regex] 添加到命令中后,该命令在“空白”shell 中开始正常工作。但是,我不知道为什么我的登录 shell 似乎默认为grep -P

  • 只有一个grep二进制/bin/grep
  • 没有为grep=pgrep或定义别名grep="grep -P"
  • 没有GREP_OPTIONS定义环境变量。

这是怎么回事?

注意:操作系统是 RHEL v5.10,Bash 是 v3.2.25,grep 是 v2.5.1

答案1

这些变量有吗?

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

其中任何一个都可能影响 grep 的行为。

您可以尝试“set -x”来查看运行的各个命令。您还可以将命令移到 shell 脚本中并从 cron 调用该脚本。这样,您可以更轻松地添加诸如setenvset -x之类的命令。

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

相关内容