如何将函数内部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":指定要执行的目标命令是funcoutput.file:用来保存日志的文件
这个命令会把func和内部make的所有输出同步显示在你的终端,同时完整写入到日志文件里,完美解决你的痛点。
方案3:过滤掉无关的冗余日志(适合能识别冗余特征的场景)
如果你的问题只是用2>&1时混入了不想看到的verbose日志,且你能明确识别这些日志的特征(比如都包含特定关键词),那可以用grep过滤掉它们。举个例子,假设冗余日志都带有DEBUG:标识,那可以这么写:
func 2>&1 | grep -v "DEBUG:" | tee output.file
这样既能保留make的所有输出,又能把你不需要的冗余日志从终端和文件里剔除。
备注:内容来源于stack exchange,提问作者BrownianBridge
相关产品推荐
相关产品推荐

