如何让csh脚本的echo命令不执行date,实现crontab动态归档文件名
解决csh脚本构建crontab时date命令提前执行的问题
要让crontab条目里的date命令在cron执行时才动态运行,而非安装脚本运行时就被解析,你需要阻止csh在echo阶段执行命令替换,具体有两种可行方案:
方案1:转义双引号内的特殊字符
在csh的双引号字符串中,$(变量替换)和`(命令替换)会被自动解析,所以需要用反斜杠\转义这些符号,让它们以原字符串形式写入crontab:
echo " 00 00,06,12,18 * * * csh -c 'find last 6 hrs of modified files and tar/zip them into /mnt/dir1/dir2/archive/filename_\${HOST}_\`date +\%Y_\%j_\%H_\%M\`.tar.gz'" >> crontab
关键注意点:
- 转义
${HOST}为\${HOST},确保cron执行时才获取主机名(而非脚本运行时) - 转义
`date...`为\`date...\`,避免脚本提前执行date命令 - 将
date命令里的%转义为\%,因为crontab会把%视为换行符,必须转义才能正确传递给date命令
方案2:用单引号包裹整个crontab条目
csh的单引号会完全阻止内部的变量和命令替换,因此可以把整个crontab命令用单引号包裹,同时调整内部的引号避免冲突:
echo ' 00 00,06,12,18 * * * csh -c "find last 6 hrs of modified files and tar/zip them into /mnt/dir1/dir2/archive/filename_${HOST}_`date +\%Y_\%j_\%H_\%M`.tar.gz"' >> crontab
关键注意点:
- 把内部的
'find...'改成"find...",避免和外层的单引号冲突 - 同样需要将
date命令里的%转义为\%,适配crontab的特殊字符规则
原理说明
你遇到的问题根源是:在csh的双引号环境中,`date...`会被立即执行命令替换,将date的输出结果直接插入到字符串中,导致写入crontab的是固定的日期值,而非动态的date命令。通过转义特殊字符或使用单引号包裹,就能让这些符号以原字符串形式写入crontab,等到cron每次执行任务时,才会解析并运行date命令,生成动态的归档文件名。
内容的提问来源于stack exchange,提问作者Qman
相关产品推荐
相关产品推荐

