根本原因是zip解压丢失可执行位且git不跟踪权限,临时修复用chmod +x vendor/bin/phpunit,一劳永逸需在composer.json中配置post-install-cmd钩子自动赋权。

vendor/bin 脚本 Permission denied 是 ZIP 解压丢权限,不是目录写入失败
Linux/macOS 下运行 vendor/bin/phpunit 报 Permission denied,99% 不是 composer install 本身失败,而是 ZIP 包解压后丢失了可执行位。Git 也不跟踪文件权限,所以每次重装都会复现。
验证方法:ls -l vendor/bin/phpunit —— 如果显示 -rw-r--r--(没有 x),就确认是这个问题。
- 临时修复:直接运行
chmod +x vendor/bin/phpunit或批量chmod +x vendor/bin/* - 但下次
composer install或update后又变回不可执行,因为 ZIP 元数据里没存权限位 - 根本解法是在
composer.json中加自动钩子,让安装完立刻补上:
"scripts": {
"post-install-cmd": "chmod +x vendor/bin/*",
"post-update-cmd": "chmod +x vendor/bin/*"
}
注意:该命令在 Windows 下被忽略,不生效也不报错。
Windows 下 “不是内部或外部命令” 和 chmod 无关
Windows 根本不认 #!/usr/bin/env php 这种 shebang,也默认不给 PHP 脚本生成 .bat 包装器——这事得包作者自己实现(比如 symfony/console 就做了)。
你不能靠 chmod、PowerShell 的 Set-ExecutionPolicy 或改文件属性解决。
- 推荐方案:显式用
php vendor/bin/phpunit调用(最稳,跨平台) - 手动补
.bat:在vendor/bin/下新建phpunit.bat,内容为:@php "%~dp0phpunit" %* - 换工具:优先选已自带
.bat的包,比如 Laravel 的artisan、Symfony 的console
为什么改了权限还是 No such file or directory?
现象:ls -l vendor/bin/phpunit 显示已有 x 位,但执行仍报 No such file or directory —— 这不是权限问题,是 shebang 指向了不存在的 PHP 路径。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
检查步骤:
- 运行
head -n1 vendor/bin/phpunit,看第一行是不是#!/usr/bin/env php - 再运行
which php,确认 CLI PHP 实际路径(如/opt/homebrew/bin/php) - 如果
which php无输出,说明php命令未加入$PATH,或者当前 shell 没加载配置
修复方式:要么把正确 PHP 路径加进 $PATH,要么手动编辑脚本第一行,改成绝对路径(如 #!/opt/homebrew/bin/php),但要注意后续更新可能覆盖。
别和 sudo composer install 搞混了
Permission denied 在 vendor/bin 脚本里出现,和 composer install 过程中写 vendor/ 或 composer.lock 失败是两回事。后者通常是目录属主被 sudo 污染过,导致普通用户无法写入。
如果你同时遇到两种错误,先分清来源:
- 脚本执行报错 → 查
vendor/bin/*权限和 shebang -
composer install报file_put_contents(.../vendor/autoload.php): Permission denied→ 查ls -ld vendor/所属用户,用chown -R $USER:$USER vendor/归还所有权
真正容易被忽略的是:shebang 路径错配和所有权污染经常共存,但它们触发的错误表现相似,排查时必须拆开验证,不能一并 chmod 或 chown 了事。










