我有一个脚本,当从交互式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=pgrep或grep="grep -P"定义别名 GREP_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中调用它。 这样你就可以更容易地添加像set , env和set -x这样的命令。
#!/bin/bash echo SET set echo ENV env set -x grep -il "^ws_status\s*=\s*[\"']remove[\"']$" exit