在 cron 环境中无法识别 bash 中内置的“源”

Cbh*_*ihe 2 bash cron alias 14.04

一个用户 crontab 条目,内容如下:

0 */4 * * * $HOME/postscript/fprogcache-sync
Run Code Online (Sandbox Code Playgroud)

工作正常。想在 cron-job 上下文中添加一些环境变量,然后我尝试

0 */4 * * * source $HOME/.profile; $HOME/postscript/fprogcache-sync
Run Code Online (Sandbox Code Playgroud)

直到我更改source.. 错误消息(通过 postfix 邮件发送到 root)是/bin/sh: 1: source: not found,然后确认脚本继续愉快地执行。

我记得曾在某处阅读过在 bash shell中source被定义为内置函数的别名的地方.。如果是这样,它将解释为什么source在 cron 上下文中不被识别。

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

kos*_*kos 6

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

情况确实如此,但没有系统范围的别名之类的东西。

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

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

source不起作用的真正原因cron是,默认情况下cron,crontab 中的作业在 中执行sh,这是一个符号链接/bin/dash(旨在符合 POSIX 的外壳),它根本没有实现source. 但是它确实实现了..

来自man dash

. file
       The commands in the specified file are read and executed by the
       shell.
Run Code Online (Sandbox Code Playgroud)