我一直在“玩弄”一段时间,对于我刚刚解决的大部分问题,但现在我需要解决这个问题。
为什么基本上我的所有cron作业都不能使用“If tests”
让我们来看看这个
if [ "$line" == "downloads.php" ]
当我在shell中运行它时,工作得非常好,当我把它作为cron工作启动时它就永远不会工作。解决方法
if echo "$line" | grep -q "downloads.php"
双向工作。这是为什么?对于第一个,[]基本上代表“测试”,第二个很好,它只是一个grep。但为什么“测试”在我的cron工作中不起作用? (有或没有重定向到> null)
我目前在cron工作中需要这个,现在我真的不知道如何解决,或者基本上我最终想要了解如何解决这个问题,我做错了什么。
while [[ "${ofile: -1}" != "_" ]]
这个只会产生错误“87:错误替换”,直到第一个字符为“_”
我设法克服了cron的所有问题,从完整路径到环境,这对我来说仍然是一个难题。任何帮助表示赞赏。
答案 0 :(得分:2)
听起来你正在使用bash运行脚本,而cron正在其他shell下运行它;因此,您正在使用的所有bash扩展都失败了。确保脚本上的shebang(即第一行)请求bash(#!/bin/bash
),并且cron条目直接运行它而不是指定shell(例如0 0 * * * /path/to/script
NOT 0 0 * * * /bin/sh /path/to/script
)
编辑:有几种不同的方法可以控制哪个shell用于解释脚本,具有明确的优先顺序:
/bin/sh /path/to/script
),将使用您告知运行它的shell,并且将忽略任何shebang。/path/to/script
或./script
,或将其放在PATH中并将其作为script
运行),系统将使用shebang来确定哪个shell (或其他翻译)用它来运行它。一般来说,使用适当的shebang并直接运行脚本是最好的方法;脚本应该“知道”正确的解释器是什么,这应该得到尊重。例如,如果您在便携式shell代码中编写脚本(使用#!/bin/sh
shebang),然后需要使用一些仅限bash的功能,您只需更改shebang而不必追踪所有位置它来自。
显式指定shell应该保留用于shebang错误或丢失的情况(在这种情况下更好的解决方案是修复脚本),或者你没有执行权限(再次修复脚本)。第三种选择是不可靠的后备,应尽可能避免。
P.S。如果我正在正确阅读您的上一条评论(上图),您想测试$ line 是否包含“downloads.php”,而不是它是否等于;但[ x == y]
比较测试是否相等,而非遏制。要测试包含,请使用仅限bash的[[ string == pattern ]]
表单:
if [[ "$line" == *"downloads.php"* ]]