如何从 crontab 中删除错误的控制字符

如何从 crontab 中删除错误的控制字符

我编辑了我的 crontab,奇怪的是开始出现“错误:糟糕的一分钟”。搜索后,我发现原因是错误的控制字符。我能看到角色$在每行末尾,但我不知道如何删除它。我没有做任何特别的事情,只是用它crontab -e来编辑条目,它会启动vivi就像编辑器一样)。那么,这些$最终会出现在我的文件中吗?我该如何删除它们?

fwiw,我正在使用 Maczsh


更新:添加了有问题的内容crontab。见下文

所以,我发布了一个xy令人尴尬的问题。尽管如此,我的“糟糕时刻”问题仍然存在。以下是问题crontab

HOME=/Users/punkish
APPDIR=Projects/zenodeo3
export NODE_ENV=cron
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
0 0 * * * cd $HOME/$APPDIR && bin/cron-truebug.sh

答案1

我可以在每行末尾看到字符 $,但我不知道如何删除它。

那应该在那里。$末尾的是如何cat -e表示越线(LF 字符)。“糟糕的一刻”是由其他原因造成的。

$人猫

     -e 显示非打印字符(参见 -v 选项),并显示
             每行末尾的美元符号 ('$')。

这是有问题的 crontab

这个 crontab 的问题与奇怪的字符无关,而是与完全不遵循 crontab 语法的条目有关。crontab 不是 shell 脚本– 每个“作业”都包含一个脚本,但整个 crontab 并不包含,并且您不能将 shell 命令或构造放在顶层。

也就是说,您不能将诸如[ ... ]. nvm.sh之类的内容放入您的 cronjob 中 - 您可以将其作为每个单独作业的一部分来执行,但不能全局执行。

除了实际的作业条目之外,其中唯一允许的内容就是ENV=value像第 1-2 行中那样的简单分配(这些分配是隐式“导出”的,因此export命令无论如何都不是必需的)。这看起来像脚本中的情况只是巧合。

还要别的吗除了这些任务被假定为一个工作规范行之外,因此出现“糟糕的一分钟”消息,因为第 3-6 行中的第一个字段 - 或export-[确实不是一个分钟规范。

如果你的 crontab 看起来像这样,它就会起作用:

0 0 * * * export NODE_ENV=cron NVM_DIR=$HOME/.nvm; [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"; cd ~/Projects/zenodeo3 && bin/cron-truebug.sh

(我省略了 HOME=,因为 cron 任务已经知道了,省略了 bash_completion,因为它只在交互的shell——没有必要将其作为脚本的一部分加载。我会大概也删除[ -s ]检查;如果你已经设置了工作,你可能只是假设 nvm 的存在。)

如果这看起来太笨重,作为一个 cronjob,可以创建一个专用的 shell 脚本来设置所有必要的环境并运行作为工作:

0 0 * * * ~/bin/cron.zenodeo-daily.sh

由于您使用的是 macOS,因此您还可以选择使用 launchd(Linux 类似地也有 systemd 计时器)。

相关内容