crontab のパスで変数を使用する

crontab のパスで変数を使用する

私が使用する crontab はより複雑ですが、問題を最小限の問題セットに分解しました。

私のcrontabは次のように動作しています:

mypath='/home/user/opt/script_home'
myscript='/home/user/opt/script_home/myscript.py'
* * * * * "$myscript"

しかし、次のようではありません:

mypath='/home/user/opt/script_home'
myscript="${mypath}/myscript.py"
* * * * * "$myscript"

maildir 内のエラー メッセージ:

/bin/sh: ${mypath}/myscript.py: No such file or directory

Python インタープリターは制限された cron $PATH で使用できるため、これは問題ではありません。

編集: また、bash または sh を使用して crontab を実行すると、エラーなしで実行されます。(もちろん、* * * * * を削除した後)

おそらく、ここで何か非常に基本的なことを見逃しているのでしょうが、私はしばらく前からそのことを理解し、Web で検索しました。しかし、これまでのところ、検索パラメータではうまくいきませんでした。crontab は、共通パスをいくつかの位置で醜い方法で使用して動作していますが、これは良いコードではないため、私を悩ませています。私の苦しみから私を助けてください =)

答え1

TL;DR: できません。

によるとman 5 crontab

値文字列は環境の置換や変数の置き換えのために解析されないため、次のような行は

PATH = $HOME/bin:$PATH

期待通りには動作しません。

cronのパーサーは ほど強力ではありませんbash

答え2

.bash_profile または .bashrc ファイルでこの変数 mypath を設定すると、アクセスできるようになります。

vi .bash_profile or vi .bashrc 

以下のパスを追加して保存します

 mypath='/home/user/opt/script_home'

答え3

cron は対話型でもログイン シェルでもないため、.bashrc も .bash_profile もソース化されません。したがって、これらのファイルで mypath を定義した場合、cron の使用中にその変数は使用されません。私の知る限り、cron でそれを使用する唯一の方法は、crontab スクリプトで直接定義することです (つまり、前述のように、環境の置換や変数の置き換えを行わずに)。

関連情報