🌻

crontabの環境変数設定行ではコマンド置換は使えない

2020/11/26に公開

本編

crontabで実行するコマンドに環境変数を与えたいとき

BAR="some value"
# some_command の中で環境変数 BAR を使う
* * * * * some_command

みたいに書きますが、この環境変数を定義する行には、コマンド置換(バッククウォート)は使えません。

% cat /tmp/echo.sh
echo $BAR

というファイルを用意して

% crontab -l
BAR=`/bin/date`
* * * * * /tmp/echo.sh > /tmp/bar

とすると

% cat /tmp/bar
`/bin/date`

コマンド展開されず、バッククウォートに囲まれたコマンド行がそのまま渡されます。

コマンドの行頭に定義するスタイルであれば使えます。

% crontab -l
* * * * * BAR=`/bin/date` /tmp/echo.sh > /tmp/bar

% cat /tmp/bar
Thu Nov 26 21:26:00 JST 2020

ドキュメントを確認

man crontab より

crontab の動作行は、 環境変数の設定か cronコマンドのいずれかである。
環境変数の設定は以下の形式をとる:

name = value

ただし、等号 (=) 両側のスペースはなくても良い。 value 内部の (先頭ではない) スペース文字は、値の一部として name に与えられる。 value 文字列は引用符で括ってもよい (シングルクォートでもダブルクォートでも良いが、 揃っている必要がある)。 こうすれば先頭や末尾の空白を値に渡すことができる。

明示的には書いてないが、「環境変数の設定」では、コマンド置換は使えない、ということなのだろう。

おまけ

最初

* * * * * BAR=`/bin/date` echo $BAR > /tmp/bar

と、直接 echo を呼んでたんですが、これだと /bin/date の実行結果は表示されず、何も出力されませんでした。
echo は ビルトインコマンドだからかな。ちょっと自信ないですがおそらくそうでは。

Discussion