$ touch aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBBB
$ crontab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBBB
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: No such file or directory
Run Code Online (Sandbox Code Playgroud)
这种行为看起来很不寻常(注意它如何截断错误消息中的路径)。我正在使用 Debian bullseye 11。
这是一个错误,还是有特定原因导致 crontab 有如此特殊的限制?
我无法在此处的 docker 映像上复制它:https ://hub.docker.com/r/willfarrell/crontab
roa*_*ima 20
来自 Cygwin的版本crontab打印一条解释性错误消息:
file=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcd\ntouch "$file"\ncrontab "$file"\ncrontab: usage error: filename too long\n\necho "$file" | awk \'{print length}\'\n108\nRun Code Online (Sandbox Code Playgroud)\n该消息解决了您的疑虑,但没有提供任何解释。
\n不幸的是 Debian 上的版本没有很好地解释:
\ncrontab "$file"\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU: No such file or directory\n\necho \'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU\' | awk \'{print length}\'\n99\nRun Code Online (Sandbox Code Playgroud)\n然而,源代码(apt-get source crontab)给出了大量线索cron.h:
#define MAX_FNAME 100 /* max length of internally generated fn */\nRun Code Online (Sandbox Code Playgroud)\n然后在crontab.c:
static char Filename[MAX_FNAME];\n\xe2\x80\xa6\n(void) strncpy (Filename, argv[optind], (sizeof Filename)-1);\nFilename[(sizeof Filename)-1] = \'\\0\';\nRun Code Online (Sandbox Code Playgroud)\n如果从这些片段中看不出来,文件名的长度有 99 个字符的硬编码限制。除了任意的“应该足够长”之外,我看不出其他原因。正确的方法可能是使用,但作者没有这样做。有评论指出,该代码最早可能是在 1988 年(或晚在 1994 年)编写的,但很可能是在 POSIX 之前,该常量被正式化。PATH_MAX+1