我通常使用BASH,但我正在尝试从配置了zsh的计算机和用户帐户设置cronjob。当cronjob运行时,日期变量不包含日期,只是命令返回日期的字符串。
DATE=$(date +%Y%m%d)
55 15 * * 1-5 scp user@host:/path/to/some/file/$DATE.log /tmp
我尝试在命令周围使用反引号而不是$(),但这也不起作用。是否有一种特殊的方法在zsh中执行命令替换?
答案 0 :(得分:3)
如果这是来自用户的crontab的一行,那么设置变量的行不是由shell设置的,它是由cron本身设置的 - 正如你所发现的那样,它没有做很多解释关于价值观!
值 do 得到设置,但在流程环境中设置文字值 - 并且环境变量在展开后不会被进一步解释 - 因此$(date)
保持为{{1正如你所见。
最简单的方法是:
$(date)
反引号``是插入命令结果的另一种方法,它可以在比55 15 * * 1-5 scp user@host:/path/to/file/`date +%Y%m%d`.log /tmp
更多的shell中工作(虽然它不太灵活,因为你不能嵌套它)。
答案 1 :(得分:2)
我认为cron
设置环境变量的方式不支持$()
。它甚至不支持变量替换。
我认为您必须将日期计算放入cron
命令:
55 15 * * 1-5 scp user@host:/path/to/some/file/$(date +%Y%m%d).log /tmp
或创建另一个设置变量的脚本,然后用它调用scp
(当然你可以在crontab
中调用那个脚本)。