Bash
在 MacOS 上從 cron 執行 bash 腳本時未定義變數(本地定義)
我有以下用於創建備份的腳本:
#!/usr/bin/env bash { declare -a directories=( "/Applications/Apache" "/Applications/Scripts" ) function duplicateBackups() { from=`realpath $1` to=`realpath $2` echo [ `date +"%T"` ] Copying backups from $from to $to cp -r $1 $2/ sleep 1 } date=`date +"%Y-%m-%d"` destination1='/opt/Volumes/USB1' destination2='/opt/Volumes/USB2' destination3='/opt/Volumes/FireWire' destination4='/opt/Volumes/USB3' destinationFolder='MacMini-Backups' targetFolder=$destination1/$destinationFolder/$date mkdir $targetFolder targetPath=`realpath $targetFolder` echo [ `date +"%T"` ] Starting files backups for i in "${directories[@]}" do fileName="$(basename $i)" mkdir -p $targetFolder/Files/ echo [ `date +"%T"` ] Backing up "$i" as "$targetPath/Files/$fileName.tgz" tar -Pczf $targetFolder/Files/$fileName.tgz -C $i . sleep 1 done echo [ `date +"%T"` ] Files backups finished sleep 1 echo [ `date +"%T"` ] Starting databases backup sleep 1 mkdir -p $targetFolder/Databases/ echo [ `date +"%T"` ] Backing up all databases into $targetPath/Databases/full-dump.sql.gz mysqldump --opt --all-databases --skip-lock-tables | gzip -c > $targetFolder/Databases/full-dump.sql.gz for db in `mysql -se "show databases;"`; do if [[ ${db} != *"schema"* ]]; then echo [ `date +"%T"` ] Backing up database $db into $targetPath/Databases/$db-dump.sql.gz mysqldump --skip-lock-tables --opt $db | gzip -c > $targetFolder/Databases/$db-dump.sql.gz sleep 1 fi done; echo [ `date +"%T"` ] Databases backup finished sleep 1 duplicateBackups $destination1/$destinationFolder/$date $destination2/$destinationFolder duplicateBackups $destination1/$destinationFolder/$date $destination3/$destinationFolder duplicateBackups $destination1/$destinationFolder/$date $destination4/$destinationFolder } >> /Applications/Scripts/Logs/backups.log
當我手動執行這個腳本時,它工作得非常好,無論是來自 shell、bash 還是 ZSH。
在這種情況下,日誌文件如下所示:
[ 09:26:05 ] Starting files backups [ 09:26:05 ] Backing up /Applications/Apache as /Volumes/USB1/MacMini-Backups/2020-12-31/Files/Apache.tgz [ 09:27:14 ] Backing up /Applications/Scripts as /Volumes/USB1/MacMini-Backups/2020-12-31/Files/Scripts.tgz [ 09:27:15 ] Files backups finished [ 09:27:16 ] Starting databases backup [ 09:27:17 ] Backing up all databases into /Volumes/USB1/MacMini-Backups/2020-12-31/Databases/full-dump.sql.gz [ 09:27:35 ] Backing up database Cloud into /Volumes/USB1/MacMini-Backups/2020-12-31/Databases/Cloud-dump.sql.gz [ 09:27:36 ] Backing up database mysql into /Volumes/USB1/MacMini-Backups/2020-12-31/Databases/mysql-dump.sql.gz [ 09:27:38 ] Backing up database radek into /Volumes/USB1/MacMini-Backups/2020-12-31/Databases/site-dump.sql.gz [ 09:27:41 ] Backing up database radek_j3 into /Volumes/USB1/MacMini-Backups/2020-12-31/Databases/site_j3-dump.sql.gz [ 09:27:45 ] Backing up database test into /Volumes/USB1/MacMini-Backups/2020-12-31/Databases/test-dump.sql.gz [ 09:27:46 ] Backing up database site_j3 into /Volumes/USB1/MacMini-Backups/2020-12-31/Databases/joomla_3-dump.sql.gz [ 09:27:48 ] Backing up database joomla_dev into /Volumes/USB1/MacMini-Backups/2020-12-31/Databases/joomla_dev-dump.sql.gz [ 09:27:49 ] Backing up database joomla_dev2 into /Volumes/USB1/MacMini-Backups/2020-12-31/Databases/joomla_dev2-dump.sql.gz [ 09:27:51 ] Backing up database joomla_j4 into /Volumes/USB1/MacMini-Backups/2020-12-31/Databases/joomla_j4-dump.sql.gz [ 09:27:53 ] Backing up database joomla_site into /Volumes/USB1/MacMini-Backups/2020-12-31/Databases/joomla_site-dump.sql.gz [ 09:28:06 ] Databases backup finished [ 09:28:07 ] Copying backups from /Volumes/USB1/MacMini-Backups/2020-12-31 to /Volumes/USB2/MacMini-Backups [ 09:28:30 ] Copying backups from /Volumes/USB1/MacMini-Backups/2020-12-31 to /Volumes/FireWire/MacMini-Backups [ 09:28:43 ] Copying backups from /Volumes/USB1/MacMini-Backups/2020-12-31 to /Volumes/USB3/MacMini-Backups
但是,如果我通過 cronjob、Automator 甚至 Apple Calendar 執行它,日誌文件看起來像這樣:
[ 06:00:00 ] Starting files backups [ 06:00:00 ] Backing up /Applications/Apache as /Files/Apache.tgz [ 06:01:22 ] Backing up /Applications/Scripts as /Files/Scripts.tgz [ 06:01:23 ] Files backups finished [ 06:01:25 ] Starting databases backup [ 06:01:26 ] Backing up all databases into /Databases/full-dump.sql.gz [ 06:01:26 ] Databases backup finished [ 06:01:27 ] Copying backups from to [ 06:01:46 ] Copying backups from to [ 06:01:58 ] Copying backups from to
我假設我在該腳本中定義的這些變數沒有任何效果。
有誰知道這裡可能是什麼問題?
非常感謝bitinerant和Mark Wagner的幫助。在我添加錯誤輸出後,結果發現它是缺少路徑和缺乏訪問目錄和從 MySQL 讀取數據庫列表的權限之間的混合。
非常感謝