运行的命令source
不起作用。
crontab -e
*/1 * * * * echo "1" > $HOME/cron && source $HOME/.zshrc && echo "2" >> $HOME/cron2 && source /home/alux/gitHub/rememberMe/.venv/bin/activate && echo "3" >> $HOME/cron && python /home/alux/gitHub/rememberMe/rememberMe/manage.py runcrons > /home/alux/gitHub/rememberMe/rememberMe/cronjobs.log && echo "4" >> $HOME/cron
cron文件的内容是1
。
答案1
source
是一个bash
-ism (或者zsh
-ism 就此而言),而默认cron
使用sh
( dash
) 作为选择的 shell。
因此您需要使用.
而不是source
来保持 POSIX:
. "$HOME"/.zshrc
或者你可以使用以下SHELL
变量将 shell 更改为你想要的任何 shell crontab
:
SHELL=/usr/bin/zsh
crontab
您需要将其放在任何命令输入之前的顶部附近。
按照你的例子:
SHELL=/usr/bin/zsh
*/1 * * * * echo "1" > $HOME/cron && source $HOME/.zshrc && echo "2" >> $HOME/cron2 && source /home/alux/gitHub/rememberMe/.venv/bin/activate && echo "3" >> $HOME/cron && python /home/alux/gitHub/rememberMe/rememberMe/manage.py runcrons > /home/alux/gitHub/rememberMe/rememberMe/cronjobs.log && echo "4" >> $HOME/cron
现在您可以继续使用原来的source
方法。
对于您的情况,这是推荐的方法,因为您正在source
-ing .zshrc
,大概您zsh
在那里有特定的声明,但在中不起作用sh
。
如果您不想设置SHELL
变量,您可以将整个命令作为参数运行zsh -c
,但这需要小心引用。
更安全的方法是将命令放入脚本中,然后使用#!/usr/bin/env zsh
shebang 将其作为可执行文件运行或作为参数运行zsh
(不使其可执行)。
附注:请始终引用变量扩展,除非您有意对其进行单词拆分和路径名扩展。