在 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 脚本中直接定义它(即,无需环境替换或替换变量,如前所述)。

相关内容