我有一个脚本,它可以执行一些日常工作,当从交互式 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 调用该脚本。这样,您可以更轻松地添加诸如set
、env
和set -x
之类的命令。
#!/bin/bash
echo SET
set
echo ENV
env
set -x
grep -il "^ws_status\s*=\s*[\"']remove[\"']$"
exit