在 macOS 下从 cron 调用 Bash 脚本时不会发生通配符扩展

在 macOS 下从 cron 调用 Bash 脚本时不会发生通配符扩展

我有一台运行 macOS Monterey 的 Mac mini,它在 Docker 容器中运行 InfluxDB。我正在尝试通过我调用的 shell 脚本设置一个夜间 cronjob,以备份数据、压缩数据,并且只保留七个最近的备份。无论我是手动运行还是通过 cron 运行,备份部分都可以完美运行,但让我感到悲伤的是 cron 中的 shell 扩展以获取当前备份文件数量,因此我只能保留最新的备份文件。

我把整个事情简化为只是想弄清楚如何让 shell 扩展在 cron 下工作,运气为零。

我想出的最简单的事情是这样的,当手动运行它时,它的行为(正确)如下:

$ /bin/bash -c 'BACKUPS=(/Users/virtualwolf/Documents/InfluxDB_Backups/*) && echo "Number of backups: ${#BACKUPS[*]}" && echo "Oldest backup: ${BACKUPS[0]}"'
Number of backups: 10
Oldest backup: /Users/virtualwolf/Documents/InfluxDB_Backups/2022-04-12_00-30.zip

如果我将完全相同的内容放入 cron 中,我会得到以下结果:

Number of backups: 1
Oldest backup: /Users/virtualwolf/Documents/InfluxDB_Backups/*

我知道默认情况下 cron 使用/bin/sh,并且我也尝试SHELL=/bin/bash在我的顶部进行设置crontab,但无济于事(尽管我不认为如果我直接使用#!/bin/bash?的 shebang 调用脚本,这不会有任何效果。 )。

我在这里遗漏了一些明显的东西吗?

[编辑] 为了澄清一点,我目前仅使用 cron 进行测试,并排除了运行实际的脚本文件只是为了达到最小可能的情况,相关crontab条目如下所示:

* * * * * /bin/bash -c 'BACKUPS=(/Users/virtualwolf/Documents/InfluxDB_Backups/*) && echo Number of backups: ${#BACKUPS[*]} && echo Oldest backup: ${BACKUPS[0]}'

如果我将完全相同的行 ( /bin/bash -c 'BACKUPS=(/Users/virtualwolf/Documents/InfluxDB_Backups/*) && echo Number of backups: ${#BACKUPS[*]} && echo Oldest backup: ${BACKUPS[0]}') 复制到我的终端中,它会按预期工作,并列出十个文件并显示最旧的备份。当它被执行时cron,shell扩展还没有发生,它把BACKUPS变量当作文字字符串/Users/virtualwolf/Documents/InfluxDB_Backups/*

答案1

因此,感谢 @muru 的出色提问,事实证明这与 Cron 和 shell 扩展完全无关,而是/usr/sbin/cron可执行文件在“系统偏好设置”>“安全和隐私”>“隐私”中没有完全磁盘访问权限的情况。

我解锁了首选项窗格,进入“完整磁盘访问”,单击+并点击CmdShiftG打开“转到文件夹”对话框,弹出/usr/sbin并找到cron并添加它,现在一切都很顺利。

相关内容