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

Ubuntu 22.04下如何同时实时保存命令输出到文件与变量

解决方案

要实现实时将命令的stdout和stderr写入日志文件,同时捕获输出到变量且不打印到控制台,可以结合2>&1、stdbuf和tee命令完成,具体实现如下:

核心思路

  • 2>&1:将命令的标准错误(stderr)重定向到标准输出(stdout),实现两类输出合并
  • stdbuf -o0:关闭tee命令的输出缓冲,确保内容实时写入日志文件(避免管道缓冲导致的延迟)
  • tee:将输入内容同时写入指定日志文件和自身的stdout,让$(...)能捕获stdout内容存入变量

最终命令格式

output=$(${long_running_command} 2>&1 | stdbuf -o0 tee /tmp/file.log)

用你的示例命令测试

output=$(for i in 1 2 3 4 5; do echo "$(date): Sleep: $i"; sleep $i; done 2>&1 | stdbuf -o0 tee /tmp/file.log)
echo "$output"

执行后效果:

  • 用tail -f /tmp/file.log可实时看到每一行输出
  • 命令执行完成后,echo "$output"会打印所有捕获到的内容

之前方法无效的原因

  1. 第一种写法:output=$(${long_running_command} 2>&1)先将所有输出存入变量,再通过echo写入文件,必须等命令完全执行完才能拿到变量内容,因此无法实时写入日志
  2. 第二种写法:${long_running_command} >> /tmp/file.log 2>&1直接将输出重定向到文件,$(...)捕获的是命令的stdout,但此时stdout已被重定向到文件,所以变量为空

内容的提问来源于stack exchange,提问作者Raul Kaubi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:35:58