为什么不允许在与 crontab 作业相同的 crontab 行中添加注释?

为什么不允许在与 crontab 作业相同的 crontab 行中添加注释?

这可能取决于我的母语不是英语,但是crontab.5手册页自相矛盾。

空行、前导空格和制表符将被忽略。第一个非空格字符是井号 (#) 的行是注释,会被忽略。请注意,注释不允许与 cron 命令位于同一行,因为它们将被视为命令的一部分。同样,注释也不允许与环境变量设置位于同一行。

例如 crontab 行

00 20 * * *  sh test.sh  # frobnicate the sales data

这似乎有效。那么问题出在哪里呢?

我很清楚这个注释不是由 cron 本身解析和解释的。它被视为最后一个命令字段的一部分并移交给 shell。 shell 将其视为注释,没有任何问题。

那么问题出在哪里呢?

或者 crontab 手册页的表述不够完善?

答案1

就像马库斯的回答所说,你已经在这里回答了你的问题:

我很清楚这个注释不是由 cron 本身解析和解释的。它被视为最后一个命令字段的一部分并移交给 shell。 shell 将其视为注释,没有任何问题。

但要将其应用到实际环境中,请考虑以下因素:

SHELL=/bin/sh
* * * * * foo.sh bar#bar

/bin/sh使用参数 和-c运行,foo.sh bar#bar其中类似 POSIX 的 sh 不应将 用作#注释标记,而是foo.sh使用参数运行bar#bar。 Cron 并不关心“评论”。

* * * * * foo.sh "foo #bar"

与上一个类似。

SHELL=/bin/echo
* * * * * foo bar # asdf

echo与参数-c和一起运行foo bar # asdfecho正确打印字符串。 Cron 并不关心“评论”。

在更简单的情况下,

00 20 * * *  sh test.sh  # frobnicate the sales data

cron 使用参数 和 运行 shell -csh test.sh # frobnicate the sales data并且类似 POSIX 的 shell 应该将其视为注释并在运行之前将其删除sh test.sh。只是 cron 并不真正关心“shell”对命令行的作用。

手册页上说“不允许评论”并不意味着你被禁止在那里放置哈希符号,只是它们不会被 cron 视为评论。 “允许”在这里的意思是“使成为可能”(参见例如维基词典,意义 7)。

答案2

正如您提到的,从 Cron 的角度来看,它不被视为评论。

这确实回答了这个问题:

这些行中不可能有 Cron 注释;该行的整个剩余部分被复制为要由 shell 执行的命令。 Cron 调用的 shell 如何处理该字符串完全是 shell 的责任,并且您的#符号可能不会被解释为所选 shell 中的注释。

手册页提供了有关此问题的准确信息,因此我发现它的表述很清楚。事实上,它甚至解释了如果试图在那里发表评论的后果。

至于“为什么》,没有具体的答案,就是这么定义的。

相关内容