如何在命令嵌套调用时分别重定向stdout与stderr
问题:捕获嵌套命令各自的stdout/stderr到独立文件
问题描述
部分程序(called-command)会将另一个带参数的程序(indirect-command)作为自身参数,例如time、timeout、stdbuf、perf等命令。
我希望将called-command和indirect-command的stdout与stderr分别捕获到独立文件中。
理想的实现逻辑如下(当前写法无法正常运行):
/usr/bin/time -p -- { \ timeout -k 10 7 { \ stdbuf -oL { \ ./main >main_out.log 2>main_err.log; \ } \ } 2>timeout.log; \ } 2>time.log
具体需求:
- 将
time命令的stderr输出到time.log - 将
timeout命令的stderr输出到timeout.log stdbuf的stdout和stderr归入timeout的输出/错误流- 程序
main的stdout和stderr分别输出到main_out.log和main_err.log
已尝试方案
我知道time命令有-o OUTPUT_FILE选项,但这是time的专属特性,我需要一种通用方法来捕获作为其他命令参数的命令的输出/错误。
我猜测这可能无法通用实现,因为called-command实际仅接收字符串参数,由其自行解析为选项并识别indirect-command,因此它不会特殊处理
<或>字符...
- 网上搜索结果多为管道、
&&、||或while循环相关示例,尝试适配后发现不适用 - 用引号包裹子参数会导致父命令将整个字符串视为命令名,报错类似
'timeout -k 10 7...' does not exist - 尝试过参考链接中的括号和大括号写法,但调试许久仍无法正常运行
- 评论中提到
tee,但不知如何在此场景使用,且不希望新增进程影响time的结果
提前感谢解答。
内容的提问来源于stack exchange,提问作者onlycparra
相关产品推荐
相关产品推荐

