在 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,它運行時不會出現錯誤。 (當然刪除***之後)

我可能在這裡遺漏了一些非常基本的東西,但我已經花了一段時間思考並在網上搜索。但到目前為止,我的搜尋參數並不順利。 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 腳本中直接定義它(即沒有環境替換或變數替換,如前所述)。

相關內容