cronのコマンドに引数として日付を与えたかった。
dateコマンドでYYYY-MM-DD形式の日付を与えるためにcrontabにはこう記述した。
*/5 * * * * /bin/sh /path/to/script `date '+%Y-%m-%d'`
しかし動かない。
ログにはこんな感じで不完全なコマンドが記録されている。
Nov 30 19:30:01 myhost CRON[18201]: CMD (/bin/sh /path/to/script `date '+)
確認したところ、crontabに書くコマンドは%(パーセント)は改行文字に置き換えられるとのこと。
そのため%の前でコマンドが切れていたのだ。
「第 6」フィールド (行の残りの部分) には実行されるコマンドを指定する。 その行のコマンド部 (改行文字または % 文字まで) が /bin/sh (またはその crontab ファイルの SHELL 環境変数で指定されたシェル) によって実行される。 コマンド中にパーセント記号 (%) が バックスラッシュ (\) によってエスケープされずに置かれていると、 改行文字に置き換えられ、最初に現れた % 以降の全てのデータは 標準入力としてコマンドに送られる。
パーセント記号をエスケープしたら意図したとおりに動いた。
*/5 * * * * /bin/sh /path/to/script `date '+\%Y-\%m-\%d'`
crontabに%(パーセント)を書くときはエスケープすること。