2010-05-21 232 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)。