Bash

在 macOS 下從 cron 呼叫 Bash 腳本時不會發生萬用字元擴展

  • April 20, 2022

我有一台執行 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並添加它,現在一切正常。

引用自:https://unix.stackexchange.com/questions/699521