“Operation not permitted”等报错主因是系统安全机制:Gatekeeper隔离(查ls -l@、清com.apple.quarantine)、终端缺完全磁盘访问权限(需在隐私设置中授权并重启)、SIP限制(影响/usr等路径,恢复模式查csrutil status)、或PATH/DYLD环境异常(检查$PATH、避免污染DYLD_LIBRARY_PATH)。
遇到 macos 终端运行脚本报错,尤其是 “operation not permitted”、“command not found” 或 “dyld: library not loaded” 这类提示,大概率不是脚本本身写错了,而是系统安全机制在起作用。关键要分清是 gatekeeper 隔离、sip 限制、权限配置错误,还是动态库环境异常——每种情况对应不同排查路径。
检查文件是否被 Gatekeeper 隔离(最常见于新下载/传输的脚本)
macOS 会对从网络下载或跨设备传入的文件自动添加 com.apple.quarantine 属性,即使有执行权限也不让运行。
- 运行
ls -l@ xxx.sh,若输出中含com.apple.quarantine,就是它在作怪 - 清除隔离属性:
sudo xattr -d com.apple.quarantine xxx.sh(单个文件)或sudo xattr -r -d com.apple.quarantine /path/to/dir(整个目录) - 也可右键脚本 → “显示简介” → 拉到最底部,勾选“通用”里的“锁定”再取消,有时能触发系统重新评估信任状态
确认终端是否具备完全磁盘访问权限(Ventura 及之后版本高频原因)
从 macOS Ventura 开始,终端应用默认不拥有完整磁盘访问权,哪怕你是管理员,运行涉及读写系统路径、调用某些工具链的脚本也会被拦截。
- 打开「系统设置」→「隐私与安全性」→「完全磁盘访问权限」
- 点击右下角锁图标输入密码解锁
- 若列表里没有“终端”,直接把
/Applications/Utilities/Terminal.app拖进去;已有则确保开关已开启 - 必须退出并重启终端,新权限才会生效
验证 SIP 是否影响底层操作(尤其当脚本调用系统工具或修改 /usr 等路径时)
System Integrity Protection 是内核级防护,会阻止对 /System、/usr、/bin 等目录的写入或替换,哪怕用了 sudo 也无效。
- 先判断是否真被 SIP 拦截:在恢复模式下运行
csrutil status,返回 “enabled” 表示 SIP 开启中 - 如果脚本需要临时写入受保护路径(如重建 dyld 缓存、修复符号链接),需进恢复模式执行
csrutil disable→ 操作 →csrutil enable,但切勿长期关闭 - 更安全的做法是避开受保护区域:把脚本逻辑迁移到
~/bin或/usr/local/bin,并确保这些路径在$PATH中靠前
排查 PATH 和动态库环境是否被污染(导致命令消失或启动失败)
看似脚本问题,实则是 shell 找不到解释器或依赖库,比如 #!/usr/bin/env python3 失效,或运行时报 dyld: Library not loaded。
- 运行
echo $PATH,确认包含/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin;若缺失,检查~/.zshrc或/etc/paths是否误覆盖 - 检查
DYLD_LIBRARY_PATH:echo $DYLD_LIBRARY_PATH,非空且指向 Homebrew 或自定义 lib 目录时,极可能干扰系统命令,建议临时unset DYLD_LIBRARY_PATH - 若大量基础命令(
ls、cp)突然失效,优先重建 dyld 缓存:sudo update_dyld_shared_cache -force(需先禁用 SIP)


















