bash 中的内置命令‘source’在 cron 环境中无法识别

bash 中的内置命令‘source’在 cron 环境中无法识别

用户 crontab 条目内容如下:

0 */4 * * * $HOME/postscript/fprogcache-sync

运行良好。我想向 cron-job 上下文添加一些环境变量,然后我尝试

0 */4 * * * source $HOME/.profile; $HOME/postscript/fprogcache-sync

source直到我将其更改为,它才起作用.。错误消息(由 postfix 邮件发送给 root)是/bin/sh: 1: source: not found,随后确认脚本继续顺利执行。

我记得在某处读到过它被定义为bash shell 中source内置命令的别名。如果是这样,那就可以解释为什么在 cron 上下文中无法识别它。 .source

是这样的吗?如果是这样,那么系统范围的别名.定义在哪里?

答案1

是这样的吗?如果是这样,那么系统范围的别名.定义在哪里?

确实如此,但是不存在系统范围的别名。

.source在 Bash 中是相同的内置函数,但它直接在源代码级别定义(https://askubuntu.com/a/25491/380067)。

同一个内置函数有两个名字的原因很可能在于Bash 的目标是在一定程度上符合 POSIX 标准;因此source为了提供一个助记名称并.为了遵守 POSIX 的标准。

source无法运行的真正原因cron是,默认情况下,croncrontab 中的作业是在 中执行的sh,这是一个符号链接/bin/dash(一个旨在符合 POSIX 标准的 shell),它根本没有实现source。然而它确实实现了.

man dash

. file
       The commands in the specified file are read and executed by the
       shell.

答案2

我认为你应该在 bash 上运行你的脚本,尝试这个:

0 */4 * * * /bin/bash -c "$HOME/postscript/fprogcache-sync"

如果您想在命令和调试脚本中添加日志,请像这样添加日志:

0 */4 * * * /bin/bash -c "$HOME/postscript/fprogcache-sync" > /var/log/automatic_backup.log 2>&1

相关内容