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

Sam*_*tch 5 linux bash grep environment-variables

我有一个脚本可以做一些内务处理,当从交互式 shell 调用时它运行良好,但在被 cron 调用时什么也没做。为了解决这个问题,我使用以下命令启动了一个带有“空白”环境的 shell:

env -i /bin/bash --noprofile --norc
Run Code Online (Sandbox Code Playgroud)

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

grep -il "^ws_status\s*=\s*[\"']remove[\"']$"
Run Code Online (Sandbox Code Playgroud)

但是,当从交互式 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

Tom*_*ime 2

这些变量有et吗?

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

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

您可以尝试的一件事是“set -x”来查看运行的各个命令。您还可以将命令移至 shell 脚本中并从 cron 调用该脚本。这样您就可以更轻松地添加setenv、 等命令set -x

#!/bin/bash
echo SET
set
echo ENV
env
set -x
grep -il "^ws_status\s*=\s*[\"']remove[\"']$"
exit
Run Code Online (Sandbox Code Playgroud)