我有一个简单的文本文件,我正在使用BASH脚本监视更改。 我正在寻找的文本可能从行的开头或空格偏移开始。 我的搜索很简单;
#!/bin/bash
value=`/bin/grep "^\s*mystring:" mytextfile`
echo "found: [$value]" >> myoutput.log
这在命令行上运行时效果很好,但是如果从crontab中配置的脚本调用则不起作用。我有一个问题的解决方法,但仍然无法解释为什么在从crontab中调用grep时一起使用插入符号(^)和空格(\ s *)?
改变PATH和环境似乎没有任何影响。有什么想法吗?
...感谢您的评论!
解决方案是使用语法;
value=`/bin/grep -E '^[[:space:]]*mystring:' myfile`
需要三件事的组合;
我仍然不确定为什么当[s不在crontab中时,[[:space:]]工作,当它以交互方式工作时。
答案 0 :(得分:0)
如果你可以在命令行的shell脚本中运行这些命令并且它可以工作,但不能在crontab中运行,那么我的猜测是crontab的默认SHELL变量没有设置为与你相同的shell在命令行使用。会是这种情况吗?
你可以检查/ etc / crontab的默认值,或者你可以用同样的方式强制它在crontab本身(在日程表上方):
SHELL = /斌/庆典
我的设置为/ bin / bash,我可以像这样使用你的脚本:
*/1 * * * * (cd /tmp; /bin/bash test.sh)
found: [ mystring:]
行每分钟出现一次。所以它奏效了。
我正在运行CentOS 6.2
答案 1 :(得分:0)
通常当我使用grep进行正则表达式时,我会尝试确保包含一个标志,告诉它处理正则表达式,或者运行“egrep”来执行相同的操作。
答案 2 :(得分:0)
很抱歉,如果派对迟到了......我在使用完全相同的脚本多年后,egrep
发现了一个非常类似的问题。
结果发现LANG
环境变量问题。如果我egrep,比如'blablabla',它在控制台和crontab中都可以正常工作。但是,如果我搜索'blablablá',它会在后者中失败但在前者中失败(我在任何地方使用Latin1编码)。
printenv
给了我LANG=en_US.UTF-8
,而在控制台中我没有LANG
env变量集。因此,解决方案是将LANG=""
添加到我的crontab文件中。问题解决了。
我不知道为什么突然改变了。可能是crontab
或grep
中的更新?
所以,我会看一个env变量问题。其他人也提出了这个问题以及其他变量。