Composer命令“command not found”的根本原因是PATH环境变量未正确配置,导致系统无法定位composer可执行文件;需将composer.phar移至PATH包含的目录(如/usr/local/bin或~/bin),并确保对应shell配置文件(如.zshrc或.bashrc)已正确加载且PATH生效。

Composer命令提示“command not found”
根本原因是系统找不到 composer 可执行文件,不是安装失败,而是PATH没生效或安装路径没加入环境变量。
常见现象:bash: composer: command not found,但明明执行过 curl -sS https://getcomposer.org/installer | php;或者用 php composer.phar install 能跑,直接敲 composer install 就报错。
- 确认是否真装了:运行
which php,再看php ~/composer.phar --version是否有输出——有说明PHAR存在,问题纯属PATH - 别把
composer.phar放在临时目录(比如/tmp或下载目录),它会被清理或权限限制 - 推荐放固定位置:
sudo mv composer.phar /usr/local/bin/composer,然后sudo chmod +x /usr/local/bin/composer - Mac M1/M2用户注意:
/usr/local/bin可能被SIP保护,可改用~/bin/,并确保该目录在$PATH中(检查echo $PATH)
Windows上双击安装后cmd仍识别不了composer
官方Windows Installer确实会改注册表和PATH,但常因权限、终端缓存或用户配置冲突失效。
典型表现:PowerShell里能用,CMD里不能;或者重启后突然失效;又或者提示 'composer' is not recognized as an internal or external command。
- 先运行
where composer,看是否返回路径;没返回就说明PATH没写进去 - 手动加PATH更可靠:右键“此电脑”→属性→高级系统设置→环境变量→在“系统变量”里找到
Path→编辑→新建→填入C:\ProgramData\ComposerSetup\bin(默认安装路径) - 别只改“用户变量”,系统级工具(如Git Bash、VS Code终端)常读系统PATH
- 改完必须新开终端窗口,旧窗口的PATH不会自动刷新
Linux/macOS下PATH写了却还是不生效
不是PATH写错了,而是shell配置文件没被正确加载,或者加载顺序被覆盖。
比如你往 ~/.bashrc 加了 export PATH="$HOME/bin:$PATH",但实际登录用的是 ~/.zshrc(macOS Catalina+ 默认zsh)。
- 查当前shell:
echo $SHELL;再查配置文件是否被source:grep -E "^(export|PATH)" ~/.zshrc ~/.bashrc 2>/dev/null - 如果用了oh-my-zsh等框架,
.zshrc末尾可能有source ~/.zshrc循环引用,导致PATH重置 - 避免重复追加PATH:用
export PATH="$(dirname $(readlink -f $(which php))):$PATH"这类动态写法容易出错,直接写死路径更稳 - 测试PATH是否生效:
echo $PATH | tr ':' '\n' | grep -E "(composer|bin)"
全局安装的包命令(如 laravel/installer)找不到
这其实是Composer的“bin-dir”机制没对齐系统PATH,跟composer命令本身能否运行是两回事。
现象:composer global require laravel/installer 成功,但敲 laravel 报错;或者 composer global list 能看到包,就是命令不认。
- 先确认全局vendor路径:
composer global config bin-dir --absolute,输出类似/home/xxx/.composer/vendor/bin - 把这个路径加进PATH(同上一步),且要加在
$PATH最前面,否则可能被其他同名命令覆盖 - Mac用户注意:Homebrew装的PHP可能自带
laravel命令,和Composer全局装的冲突,用which laravel看来源 - 权限问题:如果用
sudo composer global require,生成的二进制可能属root,普通用户无法执行——绝对不要加sudo
PATH问题最麻烦的点不在怎么加,而在“谁在什么时候读了哪份配置”。同一个终端开三次,可能一次读 .zshenv,一次读 .zprofile,一次只读 .zshrc。别猜,用 ps -p $$ 看shell类型,再用 set -x 开启调试,比反复重启还快。










