composer脚本执行报permission denied,90%是脚本文件缺x权限,非属主问题;应直接chmod +x脚本文件,而非chown或sudo,因linux执行时严格校验文件可执行位。

Composer 脚本执行报 Permission denied,90% 是脚本文件本身没有可执行权限(x bit),不是目录属主问题;修复只需 chmod +x,别急着 chown 或 sudo。
为什么 composer script 执行失败却显示 Permission denied
Composer 的 scripts 本质是 shell 命令或 PHP 脚本调用,比如 "post-install-cmd": "php artisan optimize"。但如果你写的是自定义二进制脚本(如 bin/deploy.sh)并直接在 scripts 里调用 "deploy": "bin/deploy.sh",Linux/macOS 会检查该文件是否带 x 权限位。没加就报 Permission denied,和用户属主无关。
常见错误现象:
- 终端输出类似
/path/to/project/bin/deploy.sh: Permission denied,路径明确指向脚本文件而非目录 -
ls -l bin/deploy.sh显示权限为-rw-r--r--(无x) -
composer run-script deploy失败,但sh bin/deploy.sh成功——说明脚本内容没问题,只是执行方式受限
如何给 Composer 调用的脚本加执行权限
必须对脚本文件本身设置可执行位,不是对目录、不是改属主、不需要 sudo(除非你真没权限改这个文件)。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 单个脚本:
chmod +x bin/deploy.sh - 项目内所有
bin/*.sh:chmod +x bin/*.sh - 如果脚本是 PHP 类型(
.php后缀),且你想直接./script.php运行,也要加+x,并确保首行有 shebang,如#!/usr/bin/env php - Git 用户注意:Windows 写的脚本传到 Linux 可能丢失 x 权限,用
git update-index --chmod=+x bin/deploy.sh固化权限
哪些情况 chmod +x 也不管用?检查这三点
加了执行权限还报错,说明问题不在脚本文件本身,而是运行环境或配置层。
-
composer.json里脚本命令拼错了路径,比如写成"deploy": "bin/deploy"但实际文件叫deploy.sh→ 改成完整名或加 shell 封装 - 脚本依赖的二进制工具缺失,比如
deploy.sh里用了rsync,但系统没装 → 运行which rsync验证 - 脚本开头用了绝对路径的解释器(如
#!/bin/bash),但容器或 CI 环境里该路径不存在 → 改成#!/usr/bin/env bash
Docker 或 CI 中运行 composer script 报权限错怎么办
容器内 UID 不匹配会导致即使加了 +x,内核仍拒绝执行(尤其挂载宿主机脚本时)。这不是 Composer 问题,是 Linux execve() 的安全限制。
- 确认脚本文件在容器内是否真有
x权限:docker exec -it myapp ls -l bin/deploy.sh - 如果显示
-rwxr-xr-x却仍报错,大概率是 noexec 挂载选项作祟 —— 检查docker run -v是否用了:noexec,或宿主机挂载点本身设置了noexec - CI(如 GitHub Actions)中,用
run: chmod +x ./bin/deploy.sh && ./bin/deploy.sh显式加权再运行,避免依赖 git checkout 自动恢复权限
真正容易被忽略的是:脚本权限和 Composer 的全局缓存/属主问题完全无关。看到 Permission denied 先盯住报错路径末尾那个文件名,它是不是你写的脚本?如果是,chmod +x 就是唯一正解;如果不是,再按常规流程查 vendor/ 或 ~/.composer 归属。










