BusyBox为何绕过stdout重定向?对应的可行解决方法是什么?
问题原因
- 核心差异是GNU coreutils和BusyBox对工具帮助信息的输出流定义不同:
- Ubuntu自带的GNU版本
dd的--help信息默认输出到标准输出(stdout,文件描述符1),你只重定向stdout就可以完整捕获内容。 - BusyBox的子工具(包括
dd在内的大部分内置命令)的帮助信息、报错信息默认输出到标准错误(stderr,文件描述符2),你当前的实现只重定向了stdout,没有处理stderr,所以这部分内容会直接输出到默认绑定的控制台,不会被父进程捕获。
- Ubuntu自带的GNU版本
- 你测试
busybox --help可以正常捕获的原因是:BusyBox主程序本身的帮助信息是输出到stdout的,和子命令的输出逻辑独立。 - 手动验证方式:在BusyBox环境执行以下命令即可确认输出流:
# 丢弃stdout,会发现dd帮助信息仍然打印 dd --help > /dev/null # 丢弃stderr,dd帮助信息完全消失 dd --help 2> /dev/null
解决方案
根据你的需求二选一即可:
方案1:不需要区分stdout和stderr内容
在子进程执行dup2重定向的逻辑中,新增对stderr的重定向即可,除了原有重定向stdout的代码外,再加一行:
// 原有stdout重定向逻辑 dup2(pipe_write_fd, STDOUT_FILENO); // 新增stderr重定向,把stderr也指向管道写端 dup2(pipe_write_fd, STDERR_FILENO);
调整后stdout和stderr的内容都会写入同一个管道,父进程可以统一读取。
方案2:需要区分stdout和stderr的内容
额外创建一组管道专门用于捕获stderr,分别把stdout和stderr重定向到两个不同管道的写端,父进程分别读取两个管道的内容即可。
内容的提问来源于stack exchange,提问作者sktpin
相关产品推荐
相关产品推荐

