这可能取决于我的母语不是英语,但是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 # asdf
。echo
正确打印字符串。 Cron 并不关心“评论”。
在更简单的情况下,
00 20 * * * sh test.sh # frobnicate the sales data
cron 使用参数 和 运行 shell -c
,sh test.sh # frobnicate the sales data
并且类似 POSIX 的 shell 应该将其视为注释并在运行之前将其删除sh test.sh
。只是 cron 并不真正关心“shell”对命令行的作用。
手册页上说“不允许评论”并不意味着你被禁止在那里放置哈希符号,只是它们不会被 cron 视为评论。 “允许”在这里的意思是“使成为可能”(参见例如维基词典,意义 7)。
答案2
正如您提到的,从 Cron 的角度来看,它不被视为评论。
这确实回答了这个问题:
这些行中不可能有 Cron 注释;该行的整个剩余部分被复制为要由 shell 执行的命令。 Cron 调用的 shell 如何处理该字符串完全是 shell 的责任,并且您的#
符号可能不会被解释为所选 shell 中的注释。
手册页提供了有关此问题的准确信息,因此我发现它的表述很清楚。事实上,它甚至解释了如果试图在那里发表评论的后果。
至于“为什么》,没有具体的答案,就是这么定义的。