MacOS运行Linux迁移的Bash备份脚本多类报错问题咨询
问题成因分析
原脚本declare -A报错原因
macOS自带的Bash版本为3.2.x,而declare -A声明的关联数组是Bash 4.0才新增的特性。Linux发行版默认搭载的Bash基本都是4.0以上版本,所以可以正常运行;macOS自带的低版本Bash不支持该语法,就会报参数无效的错误,后续的TARGET变量解析异常也是关联数组声明失败导致的连锁错误。
修改后脚本目录报错原因
你修改后的脚本在调用backup函数时,把多个源路径拆成了多行书写,但没有添加行尾续行符\,Bash会把每一行开头没有缩进、也没有续行符的路径当成独立命令执行,系统找不到路径对应的可执行文件,就会报「Is a directory」的错误。
解决方案
方案1:升级macOS的Bash版本(兼容原脚本写法)
通过Homebrew安装新版Bash即可兼容原关联数组语法:
- 安装Homebrew后执行
brew install bash - 将脚本开头的shebang修改为
#!/usr/local/bin/bash(M系列芯片Mac路径为#!/opt/homebrew/bin/bash),调用新版Bash执行脚本即可。
方案2:修改脚本适配低版本Bash(无需升级软件)
修正续行符和路径错误即可,修改后的代码如下:
#!/bin/bash backup() { local dest_dir="$1" shift local srcs=("$@") mkdir -p "$dest_dir" rsync -avuz --delete --delete-after --progress "${srcs[@]}" "$dest_dir" } # 每行末尾加续行符\,最后一行源路径不需要加 backup /Users/myuser \ /Volumes/CORSAIR/articoli /Volumes/CORSAIR/bibliografie \ /Volumes/CORSAIR/cataloghi /Volumes/CORSAIR/cd /Volumes/CORSAIR/condominio \ /Volumes/CORSAIR/copertine /Volumes/CORSAIR/cratilo /Volumes/CORSAIR/Documenti \ /Volumes/CORSAIR/esperienza /Volumes/CORSAIR/ezine /Volumes/CORSAIR/fichte \ /Volumes/CORSAIR/filosofi /Volumes/CORSAIR/fonts /Volumes/CORSAIR/francy \ /Volumes/CORSAIR/guide_debian /Volumes/CORSAIR/guide_latex \ /Volumes/CORSAIR/guide_linux /Volumes/CORSAIR/guide_php \ /Volumes/CORSAIR/guide_slackware /Volumes/CORSAIR/html4dummies \ /Volumes/CORSAIR/Immagini /Volumes/CORSAIR/mail /Volumes/CORSAIR/mamma \ /Volumes/CORSAIR/manuale /Volumes/CORSAIR/materiali /Volumes/CORSAIR/mutt4dummies \ /Volumes/CORSAIR/noneuclidee /Volumes/CORSAIR/pearson /Volumes/CORSAIR/privacy \ /Volumes/CORSAIR/protagonisti /Volumes/CORSAIR/protagonisti_nuovo \ /Volumes/CORSAIR/public_html /Volumes/CORSAIR/retorica /Volumes/CORSAIR/sabina \ /Volumes/CORSAIR/sacchettino /Volumes/CORSAIR/Scaricati /Volumes/CORSAIR/slack4dummies \ /Volumes/CORSAIR/slackbook /Volumes/CORSAIR/slackproject /Volumes/CORSAIR/software_linux \ /Volumes/CORSAIR/software_mac /Volumes/CORSAIR/storia /Volumes/CORSAIR/system_files \ /Volumes/CORSAIR/tesi1 /Volumes/CORSAIR/tesi2 /Volumes/CORSAIR/tesi3 \ /Volumes/CORSAIR/tin4dummies /Volumes/CORSAIR/tipografia /Volumes/CORSAIR/tractatus \ /Volumes/CORSAIR/varia /Volumes/CORSAIR/venetaverifiche /Volumes/CORSAIR/xindy # 补全目标路径开头的/,同时添加续行符 backup /Users/myuser/Documents \ /Volumes/CORSAIR/argomentare /Volumes/CORSAIR/corriere \ /Volumes/CORSAIR/dialettica /Volumes/CORSAIR/dizionario /Volumes/CORSAIR/ermeneutica \ /Volumes/CORSAIR/fichte /Volumes/CORSAIR/neopositivisti /Volumes/CORSAIR/novecento \ /Volumes/CORSAIR/schelling /Volumes/CORSAIR/scuola
修正的内容还包括你之前第二个backup调用漏写的目标路径开头的/,避免文件同步到错误的相对路径下。
内容的提问来源于stack exchange,提问作者user41063
相关产品推荐
相关产品推荐

