如果在运行本地 Shell 脚本时 macOS 终端提示“permission denied”,请首先检查您是否处于正确的文件夹中并能够读取该文件。如果您打算直接运行它,请使用 chmod u+x 为您的用户添加执行权限。如果这未能解决错误,请检查其所在的文件夹,以及 macOS 是否阻止启动该 Shell 的应用程序访问该文件。请避免将 sudo 或宽泛的权限更改作为首选解决方法。
1. 确认脚本路径和当前文件夹
打开“终端”并进入包含该脚本的文件夹。如果路径包含空格,请用引号将路径括起来:
cd "/Users/yourname/Projects/My Scripts"
ls -l "./build.sh"
将示例路径和文件名替换为您自己的内容。ls -l 的输出会显示该文件的权限和所有者。如果提示找不到该文件,请找到正确的文件夹或使用完整路径。像 ./build.sh 这样的相对路径表示“当前文件夹中的 build.sh”;它不会在其他文件夹中进行搜索。
2. 为脚本添加执行权限
如果文件存在且归您所有,仅为您自己的账户添加执行权限,然后在该文件所在的文件夹中运行它:
chmod u+x "./build.sh"
./build.sh
Apple 的 Shell 脚本指南建议在运行脚本前使用 chmod u+x。其中 u 将更改限制为文件所有者;+x 则添加执行权限。这比向所有人开放读取、写入和执行权限的 chmod 777 范围更严格。Apple 的 Shell 脚本基础
如果终端仍然提示“permission denied”,请再次使用 ls -l 检查权限。您还可以通过 ls -l 查看文件的所有者,并通过 whoami 查看您的账户名。如果该脚本归其他账户所有,且您缺乏修改它的权限,请使用归您所有的文件夹中的副本,或者请求所有者或管理员授予适当的访问权限。不要为了图省事而获取系统文件的所有权。
3. 检查文件夹访问权限和脚本内容
执行不仅需要对脚本本身的权限,还需要通过整个路径的访问权限。如果您无法进入脚本所在的目录或无法访问该文件,请检查脚本的父文件夹。如果它位于共享卷、外置卷或受管卷上,其访问规则可能会有所不同;在允许复制的前提下,可以尝试在归您所有的文件夹中使用副本。
如果您的命令是在脚本尝试创建或修改输出文件时返回 Permission denied,则脚本可能是可执行的,但对目标位置缺乏写入权限。请检查目标文件夹以及脚本中的路径。不要仅仅为了解决错误而让脚本对所有人可写或可执行。
对于位于“桌面”、“文稿”或“下载”内的脚本,当由“终端”以外的应用启动时,macOS 的隐私控制也可能会产生影响。在“系统设置”中,打开隐私与安全性 > 文件和文件夹,并检查相关应用的访问权限列表。Apple 将这些控制描述为每个应用对特定位置的访问权限。Shell 命令返回的权限错误本身并不能证明该隐私设置就是根本原因。Apple:在 Mac 上控制对文件和文件夹的访问
4. 如果直接执行失败,显式运行解释器
脚本可能对您的账户可读,但缺乏执行权限。如果是 Shell 脚本,您可以指定其解释器直接读取并运行它:
/bin/sh "./build.sh"
仅当该脚本是为 sh 编写时才使用此方法。如果它的第一行指定了其他解释器(例如 Bash),请使用该解释器;解释器行(即 #! 行)指定了脚本应如何运行。Apple 建议包含该行以保持一致性。Apple 的 Shell 脚本基础
通过解释器运行可以绕过对脚本文件本身的执行权限要求,但它不会赋予读取脚本或访问脚本所使用文件的权限。如果提示信息变为缺少解释器或语法错误,请解决该具体问题;这与执行权限是不同的问题。
5. 不要使用 sudo 或禁用安全保护作为捷径
sudo 会以提升的权限运行命令;它无法修复文件缺失、路径错误或您尚未检查过的脚本。仅在您了解任务为何需要管理员访问权限,并且信任脚本的来源和内容时,才使用它。像 chmod 777 这样宽泛的更改可能会使文件面临被其他用户修改的风险。
Shell 脚本的“permission denied”提示与关于 macOS 无法验证应用的“门禁”(Gatekeeper)警告也是不同的。Apple 记录的“仍要打开”步骤适用于应用警报,并需要确信该应用值得信任;它们并不是 Shell 文件权限的通用解决方法。Apple:在 Mac 上安全打开 App
快速排查
- 立即提示
./script.sh: permission denied: 检查文件的执行权限;如果您拥有该文件且信任它,请尝试chmod u+x "./script.sh"。 - 找不到文件: 验证您当前所在的文件夹以及确切的文件名。
- 脚本已启动,随后某个命令被拒绝: 检查该命令尝试访问的具体文件或文件夹。
- 应用警报提示无法验证开发者: 仅在验证应用来源后才遵循 Apple 的应用安全指南;该警报与 Shell 的执行权限是分开的。
这些检查可以将问题缩小至脚本路径、其执行位、对其使用文件的访问权限,或是特定于应用的隐私或安全控制。仅更改与依据相符的权限或设置,然后重新运行相同的命令以查看错误是否发生变化。
参考资料
- Shell 脚本基础 — Apple Developer
- 在 Mac 上控制对文件和文件夹的访问 — Apple 支持
- 在 Mac 上安全打开 App — Apple 支持