🌻
crontabの環境変数設定行ではコマンド置換は使えない
本編
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