0

我已经“玩弄”了一段时间了,对于我刚刚解决的大多数问题,但现在我需要解决这个问题。

为什么基本上我所有的 cron 工作都不能使用“如果测试”

让我们拿这个

if [ "$line" == "downloads.php" ]

当我在 shell 中运行它时,它工作得非常好,当我将它作为 cron 作业启动时,它永远不会工作。解决方法

if echo "$line" | grep -q "downloads.php"

双向工作。这是为什么?对于第一个 [ ] 基本上代表“测试”,第二个很好,它只是一个 grep。但是为什么“测试”在我的 cron 工作中不起作用?(有或没有重定向到 >null)

我目前在 cron 工作中需要这个,现在我真的不知道如何解决,或者基本上我只是想了解如何解决这个问题,我做错了什么。

while [[ "${ofile: -1}" != "_" ]]

这只会产生错误“87:错误替换”,直到第一个字符是“_”

我设法克服了 cron 的所有问题,从完整路径到环境,这对我来说仍然是一个难题。任何帮助表示赞赏。

4

1 回答 1

2

听起来您正在使用 bash 运行脚本,而 cron 在其他 shell 下运行它;因此,您使用的所有 bash 扩展都失败了。确保脚本上的 shebang(即第一行)请求 bash ( #!/bin/bash),并且 cron 条目直接运行它而不是指定 shell(例如0 0 * * * /path/to/scriptNOT 0 0 * * * /bin/sh /path/to/script)。

编辑:有几种不同的方法可以控制将使用哪个 shell 来解释脚本,具有明确的优先顺序:

  1. 如果您使用显式 shell(例如/bin/sh /path/to/script)运行脚本,则将使用您告诉运行它的 shell,并且任何 shebang 都将被忽略。
  2. 如果您直接运行脚本(例如/path/to/script./script,或将其放在您的 PATH 中并作为 运行script),系统将使用 shebang 来确定使用哪个 shell(或其他解释器)运行它。
  3. 如果您直接运行它并且没有 shebang,那么您运行它的程序(例如 bash、sh 或 crond)可能会选择执行其他操作。在这种情况下,bash 将使用 bash 运行脚本。我不确定 crond 会做什么,它甚至可能取决于它是哪个版本。

一般来说,使用适当的 shebang 并直接运行脚本是最好的方法;脚本应该“知道”正确的解释器是什么,并且应该受到尊重。例如,如果您用可移植的 shell 代码(带有#!/bin/shshebang)编写脚本,然后需要使用一些仅限 bash 的功能,您可以简单地更改 shebang,而不必跟踪它运行的所有位置。

明确指定 shell 应该保留在 shebang 错误或丢失的情况下(在这种情况下,更好的解决方案是修复脚本),或者您没有执行权限(再次,修复脚本)。第三种选择是不可靠的回退,应尽可能避免。

Ps 如果我正确阅读了您的最后一条评论(上),您想测试 $line 是否包含“downloads.php”,而不是它是否等于;但是[ x == y]比较测试是否相等,而不是包含。要测试遏制,请使用 bash-only[[ string == pattern ]]形式:

if [[ "$line" == *"downloads.php"* ]]
于 2013-05-26T17:56:40.293 回答