You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 13:04:53