在 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
,但無濟於事(儘管我不會認為如果我直接使用 shebang 呼叫腳本會產生任何影響#!/bin/bash
? )。我在這裡遺漏了一些明顯的東西嗎?
$$ EDIT $$ 為了澄清一點,我目前僅使用 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/*
。
因此,感謝@muru 的出色提問,事實證明這與 Cron 和 shell 擴展完全無關,而是
/usr/sbin/cron
執行檔在系統偏好設置 > 安全和隱私 > 隱私中沒有完整磁碟訪問權限的情況。我解鎖了首選項窗格,進入“全盤訪問”,點擊 + 並點擊
Cmd``Shift``G
以調出“轉到文件夾”對話框,彈出/usr/sbin
並找到cron
並添加它,現在一切正常。