PHPUnit 9.6/10结合inotifywait执行时出现stty设备错误问题
解决管道触发PHPUnit时的
stty错误与版本兼容问题 问题场景
使用inotifywait监听项目文件变化,自动触发PHPUnit测试的脚本如下:
inotifywait -m --format %w%f --exclude "(\.\*|../logs|../tests/out)" -q -r -e close_write ../ | \ while read CUAL ; do if [ $? == 0 ]; then phpunit --no-configuration --color ../tests/testsSuiteREST.php fi done
该脚本在Konsole终端稳定运行多年,近期出现异常。
不同PHPUnit版本的表现
- PHPUnit 9.5.24:运行完全正常,无任何错误输出
- PHPUnit 9.6.7:测试套件能正常执行完成,但输出包含错误:
stty: 'standard input': Inappropriate ioctl for device - PHPUnit 10.x:除上述
stty错误外,还触发致命错误:Cannot override final method PHPUnit\Framework\TestSuite::__construct()
排查细节
- 直接手动执行PHPUnit命令无任何问题,注释掉
inotifywait和while循环相关代码后也正常,确认问题仅出现在管道调用的场景中 - 通过
strace追踪进程发现,错误根源是代码尝试对/dev/null执行ioctl(4, TCGETS, 0x7ffe85312130)操作,该操作因输入设备不匹配触发异常 - 可通过命令
true | phpunit --no-configuration --color ../tests/testsSuiteREST.php直接复现问题,推测是bash管道导致标准输入环境变化引发的兼容性问题
临时处理方案
- 暂时降级到PHPUnit 9.5.24版本,可完全规避该问题
- 不建议使用
2>/dev/null屏蔽错误,此操作会同时丢失其他有用的错误信息 - 已在PHPUnit官方仓库提交issue,但尚未得到回应
内容的提问来源于stack exchange,提问作者RudyMartin
相关产品推荐
相关产品推荐

