crontab ではパーセント記号をエスケープする

Posted on

タイトルのままですが、ハマったので忘れないようにメモ。

スクリプトの実行結果を日付つきのファイルに保存するために date コマンドでフォーマットを指定しましたが、なぜか構文エラーになります。同じコマンドを手動で実行すれば期待通りの動作をします。

*/10 * * * * /path/to/batch.sh > batch_`date +%Y-%m-%d-%H-%M-%S`.log

cron ログには途中までの不完全なコマンドが記録されています。

... CMD (/path/to/batch.sh > batch_`date +)

crontab(5) を確認すると以下の記述がありました。

その行のコマンド部(改行文字または % 文字まで)が /bin/sh (またはその crontab ファイルの SHELL 環境変数で指定されたシェル)によって実行される。

コマンド中にパーセント記号 (%) がバックスラッシュ (\) によってエスケープされずに置かれていると、改行文字に置き換えられ、最初に現れた % 以降の全てのデータは標準入力としてコマンドに送られる。

パーセント記号はコマンドの終端として認識されるようです。 % をエスケープすれば期待通りの動作になりました。

*/10 * * * * /path/to/batch.sh > batch_`date +\%Y-\%m-\%d-\%H-\%M-\%S`.log