I was recently setting up a cron job to do some processing on the previous day's log file:
/path/to/command --logfile=/path/to/logfile-$(date +'%Y%m%d' -d 'yesterday').logFor the non-UNIX literate readers, the $() construct says to run the command inside the parenthesis and use the output. In this case, I wanted the date for yesterday formatted as YYYYMMDD.
Tested and worked just find from the command line, but when I created a cron job for it, I found this in my inbox the next day:
/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'First thing I thought is that I had missed a "'" character somewhere, but I hadn't. How odd.
/bin/sh: -c: line 1: syntax error: unexpected end of file
What does cron have to say for itself?
Feb 21 02:00:01 server CROND[17834]: (root) CMD (/path/to/command --logfile=/path/to/logfile-$(date +')Hmm. Truncated at the first "%" sign, now why would that happen? Well, according to the manual page for crontab, the "%" character has special meaning:
Percent-signs (%) in the command, unless escaped with backslash (\), will be changed into newline characters, and all data after the first % will be sent to the command as standard input.I shudder to think how many years I've been using cron, and have managed to side-step this particular feature. I guess I've always put date functions like that into scripts, and had cron call the script, so I never had to escape the "%" in the actual crontab before.
So now the cron command looks like this:
/path/to/command --logfile=/path/to/logfile-$(date +'\%Y\%m\%d' -d 'yesterday').log
and problem solved. I had to chuckle to myself, though, because that feature has been around for at least 20 years, and somehow this is the first time I've run into it.
No comments:
Post a Comment