macos shell脚本运行失败需先区分“权限不足”与“语法错误”:前者报错如“zsh: permission denied”“operation not permitted”,属系统拦截,未进入执行阶段;后者报错如“unexpected eof”“syntax error near unexpected token”,说明脚本已被解析但代码或环境有误。
macos 上 shell 脚本运行失败,提示“权限不足”或“语法错误”,表面相似,根源完全不同。前者是系统拒绝执行,后者是解释器读不懂代码。先区分报错类型,再针对性排查,能省下大量试错时间。
看报错文字,快速判断是权限问题还是语法问题
两类错误特征明显,别混淆:
-
权限类报错:终端直接显示
zsh: permission denied: ./script.sh、Operation not permitted、getcwd: cannot access parent directories—— 这说明脚本文件本身或它要访问的路径被系统拦住了,还没到执行阶段; -
语法类报错:终端输出类似
unexpected EOF while looking for matching `''`、syntax error near unexpected token `fi`、command not found(但脚本有 shebang)—— 这说明脚本已开始被 shell 解析,只是代码写错了或环境缺失。
权限不足:按顺序检查这四层限制
macOS 的权限不是一层,而是层层叠加。漏掉任何一层,都会卡在“permission denied”。
-
文件执行权限是否开启:运行
ls -l script.sh,确认输出中所有者那一组有x(如-rwxr--r--)。没有就补上:chmod u+x script.sh; -
Gatekeeper 隔离属性是否残留:新下载或从 Windows 传来的脚本常带
com.apple.quarantine属性。用ls -l@ script.sh查,若有,执行xattr -d com.apple.quarantine script.sh清除; - 终端有没有完全磁盘访问权:macOS Ventura 及以后版本默认不给 Terminal 读写权限。去「系统设置 → 隐私与安全性 → 完全磁盘访问权限」,解锁后把 Terminal.app 拖进去,并重启终端;
-
脚本路径是否撞上 SIP 保护区:如果脚本里写了
cd /usr/bin或cp xxx /bin,SIP 会直接拦截,sudo也无效。改用用户目录(如~/bin)或/usr/local/bin,并确保该路径在$PATH前面。
语法错误:聚焦 shebang、引号和环境三处
Shell 解析失败,通常不是逻辑错,而是格式或依赖没对上。
-
第一行 shebang 是否正确且可访问:打开脚本,确认首行是
#!/bin/zsh或#!/usr/bin/env bash,不能多空格、不能有 BOM、不能写错路径(比如 Catalina 后/bin/bash已禁用); -
单引号、双引号、括号是否成对闭合:报错含
unexpected EOF或unmatched `',基本就是某处引号漏了结尾,重点检查报错行附近几行; -
解释器或命令是否在 PATH 中:比如脚本用了
python3,但系统里只有python,或 Homebrew 安装的工具不在$PATH。运行which python3和echo $PATH验证,必要时在脚本里写绝对路径(如/opt/homebrew/bin/python3)。
验证是否修复:用最小动作交叉测试
别只跑一遍脚本,用几个简单命令快速锁定问题范围:
- 执行
./script.sh失败?试试zsh script.sh—— 若成功,说明是 shebang 或权限问题; - 执行
zsh script.sh也失败?把脚本内容简化为echo "ok"再试 —— 若成功,说明原脚本有语法或路径问题; - 所有本地脚本都报
Operation not permitted?检查「完全磁盘访问权限」列表里 Terminal 是否已启用,且已重启。











