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