macOSのcronからBashスクリプトを呼び出すときにワイルドカード拡張は発生しません。

macOSのcronからBashスクリプトを呼び出すときにワイルドカード拡張は発生しません。

DockerコンテナでInfluxDBを実行するmacOS Montereyを実行するMac miniがあります。データをバックアップして圧縮し、最新のバックアップを7つだけ維持するために呼び出すシェルスクリプトを使用して夜間cronjobを設定しようとしています。バックアップ部分は手動で実行するかcronを介して実行しても完全に機能しますが、私を悲しませるのは、現在のバックアップファイルの数を取得するcronのシェル拡張なので、最新のバックアップファイルのみを保持できることです。

私は運がまったくなく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(ただし、shebangを使ってスクリプトを直接呼び出すことは効果がないと思いますが?)。SHELL=/bin/bashcrontab#!/bin/bash

ここで明らかなものを見逃していますか?

[編集する] より明確にするために、現在テスト用に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]}'端末に同じ行()をコピーすると、期待どおりに機能し、10個のファイルが一覧表示され、最も古いバックアップが表示されます。実行時にcronシェル拡張はまだ発生しておらず、BACKUPS変数をリテラル文字列として扱います/Users/virtualwolf/Documents/InfluxDB_Backups/*

答え1

したがって、良い質問に対する@muruのおかげで、これはcronとシェルの拡張にはまったく関係ありませんが、/usr/sbin/cronシステム環境設定>セキュリティとプライバシー>プライバシーで完全なディスクアクセス権を持たない実行可能ファイルの場合であることがわかりました。

環境設定ウィンドウのロックを解除し、[フルディスクアクセス]に移動して+をクリックし、CmdShiftG[フォルダに移動]ダイアログボックスをクリックして開き、/usr/sbin追加cronした後、すべてが正常になります。

関連情報