关于passthru()函数重定向stderr至stdout的异常问题求助
问题分析与解决
这不是passthru()的已知问题,问题出在shell重定向的执行顺序上。
为什么第二种写法失效?
shell对重定向的解析是从左到右依次执行的:
- 你写的
2>&1 >> logs/test.log,第一步2>&1是把stderr(文件描述符2)绑定到当前stdout(文件描述符1)的位置——也就是默认的控制台输出; - 第二步
>> logs/test.log才把stdout重定向到日志文件,但此时stderr已经绑定到原来的控制台stdout了,不会跟着一起转向文件,所以错误信息还是会输出到控制台。
正确的合并重定向写法
要让stderr和stdout都追加到日志文件,得先把stdout定向到文件,再把stderr绑定到这个已经重定向后的stdout,顺序不能反:
passthru('php -r "echo 1/0;" >> logs/test.log 2>&1');
对比第一种写法的区别
你第一种写法2>logs/test.log >> logs/test.log是分开处理两个流:
2>logs/test.log是把stderr覆盖写入到日志文件(如果文件已存在会清空原有内容);>> logs/test.log是把stdout追加写入到同一个文件。
这种写法虽然能把错误写入文件,但流的处理逻辑和合并重定向不同,且存在覆盖风险,而调整顺序后的合并写法更合理,能让两个流都以追加方式写入文件。
内容的提问来源于stack exchange,提问作者Daniel C.
相关产品推荐
相关产品推荐

