dateコマンド と crontab の コマンドライン中の %(パーセント)記号

FAQだろうけど、 crontabの話

crontab の標準出力を 日付入りファイル名で保存

30      2       *       *       *       pdumpfs /backups/latest /backups >/backups/backup-`date '+%Y%m%d%H%M'`.txt

という crontabを書いた。 2時30分に pdumpfsを起動し、 その標準出力を backup-20090204.txt という 日付入りファイル名で保存することを意図している。

エラー

しかし、 2時30分 には

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file

というエラーが出た。

manpageには

crontab の manpage には 次のような記述がある:

The entire command portion of the line, up to a newline or % character, will be executed by /bin/sh or by the shell specified in the SHELL variable of the cronfile. 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.

%記号はコマンドの終わりとして解釈され、 その後の文字列は標準入力として扱われるということだ。 くだんの crontab はコマンドライン部分に問題があり、コマンドの終わりまで 閉じる ` 記号が現れなかったためにエラーになったわけだ。

crontab から呼び出す コマンドラインで % を使いたい場合は \(バックスラッシュ)でエスケープするか、処理そのものをファイルに記述して crontab から呼び出すのが良い。