2010-05-21 204 views
0

我通常使用BASH,但我试图从配置了zsh的机器和用户帐户设置cronjob。当cronjob运行时,date变量不包含日期,只是命令返回日期的字符串。Zsh命令替换

DATE=$(date +%Y%m%d) 
55 15 * * 1-5 scp [email protected]:/path/to/some/file/$DATE.log /tmp 

我试过在命令周围使用反引号而不是$(),但那也不起作用。有没有一种特殊的方式在zsh中进行命令替换?

+0

如果你添加一行到类似于这个:'* * * * * env>/tmp/cron.env'的crontab,你可能会在该文件中找到'SHELL =/bin/sh',无论用户的shell设置为Bash或zsh。但这不是你的变量没有被设置的原因。 – 2010-05-21 17:57:16

回答

3

如果这是用户的crontab中的一行,那么设置该变量的行不是由shell设置的,它是由cron本身设置的 - 正如你发现的那样,它并没有做很多对价值的解读!

得到确定,但在这个过程中的环境中设置文字值 - 和环境变量没有得到扩张后进一步解释 - 所以$(date)住宿为$(date),如您所见。

做最简单的事情是:

55 15 * * 1-5 scp [email protected]:/path/to/file/`date +%Y%m%d`.log /tmp 

的反引号``是另一种插值命令的结果,更多的炮弹比$(command)作品(尽管它不太灵活,因为你不能嵌套它)。

+0

你可以嵌套'',但如果你必须嵌套多个层次,它会变得很乱。 – jamessan 2010-05-21 14:49:44

+0

你可以在一些贝壳中,但不能在其他贝壳中;我不确定细节,所以我尽量避免嵌套它:-) – psmears 2010-05-21 15:11:52

2

我不认为设置环境变量的cron方式支持$()的东西。它甚至不支持变量替换。

我认为你要么必须把日期计算到cron命令:

55 15 * * 1-5 scp [email protected]:/path/to/some/file/$(date +%Y%m%d).log /tmp 

或创建另一个脚本,然后设置变量调用scp它(当然你打电话脚本从您的crontab)。