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

如何将函数内部make进程的输出同时重定向到文件与标准输出?

如何将函数内部make进程的输出同时重定向到文件与标准输出?

兄弟,我懂你这种抓不到子进程输出的憋屈!你遇到的问题大概率是**make进程的输出没有通过func的标准输出/错误流传递,而是直接写到了终端(也就是/dev/tty)**,或者是func本身有一些你不想保留的stderr日志,但make的输出刚好也在stderr里,导致你用2>&1的时候把无关日志也带进来了。下面给你几个实用的解决方案:

方案1:修改func强制make输出到标准流(最干净的办法)

如果你有权限修改func的代码,那直接调整内部make的调用方式就行。把func里调用make的语句改成:

make 2>&1

这样make的所有输出(不管是正常构建信息还是错误警告)都会进入func的标准输出流,之后你只需要用最基础的命令就能实现需求:

func | tee output.file

既不会带进来额外的冗余日志,又能把所有输出同时打到终端和写入文件。

方案2:用script命令捕获所有终端输出(无需修改func)

要是没法改func,那script绝对是你的救星——它能捕获所有直接写到终端的输出,不管是不是走标准流。用法超简单:

script -q -c "func" output.file

参数说明:

  • -q:开启安静模式,避免输出Script started/Script done这类无关提示
  • -c "func":指定要执行的目标命令是func
  • output.file:用来保存日志的文件

这个命令会把func和内部make的所有输出同步显示在你的终端,同时完整写入到日志文件里,完美解决你的痛点。

方案3:过滤掉无关的冗余日志(适合能识别冗余特征的场景)

如果你的问题只是用2>&1时混入了不想看到的verbose日志,且你能明确识别这些日志的特征(比如都包含特定关键词),那可以用grep过滤掉它们。举个例子,假设冗余日志都带有DEBUG:标识,那可以这么写:

func 2>&1 | grep -v "DEBUG:" | tee output.file

这样既能保留make的所有输出,又能把你不需要的冗余日志从终端和文件里剔除。

备注:内容来源于stack exchange,提问作者BrownianBridge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 11:28:05