
我使用的 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,它運行時不會出現錯誤。 (當然刪除***之後)
我可能在這裡遺漏了一些非常基本的東西,但我已經花了一段時間思考並在網上搜索。但到目前為止,我的搜尋參數並不順利。 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 既不是互動式 shell,也不是登入 shell,因此 .bashrc 和 .bash_profile 都不是來源。因此,如果您在這些檔案中定義 mypath,則在使用 cron 時將不會有該變數。據我所知,在 cron 中擁有它的唯一方法是在 crontab 腳本中直接定義它(即沒有環境替換或變數替換,如前所述)。