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

使用pv命令输出时行尾出现^M导致tail解析异常的技术问询

pv写入镜像时stderr含^M导致tailboxbg无法识别的解决方法

问题

使用pv命令向CM3/CM4计算模块写入镜像时,将标准错误输出(stderr)重定向到临时文件,供tailboxbg对话框读取进度。但临时文件中每行末尾被追加了^M(回车符\r),tailboxbg无法识别这种换行,始终只显示第一行内容。

原执行代码

pv -teabf -s "$copySize" "$copyImage" > "devCompMod" 2> _temp &

临时文件内容示例

429MiB 0:00:01 [ 429MiB/s] ETA 0:00:33^M 819MiB 0:00:02 [ 408MiB/s] ETA 0:00:34^M ...
pv: write failed: No space left on device

遇到的障碍

尝试过多种重定向方式,但由于pv在子shell(后台&运行)中执行,无法在不中断文件读取的前提下过滤stderr中的\r字符。

解决方案

1. 自定义pv的输出格式

通过-F参数指定输出格式,强制用\n换行替代默认的\r(^M)来刷新进度行:

pv -F $'%b %t %a %e\n' -f -s "$cpSize" "$cpImage" > "$devTofu" 2> _temp &
  • %b:已传输字节数
  • %t:已耗时
  • %a:当前传输速率
  • %e:预计剩余时间
  • \n:强制在每条进度后添加换行符
  • -f:确保即使输出到非终端文件,仍保持实时刷新行为

2. 读取临时文件时处理格式

读取临时文件内容时,用tail取最后2行,再通过tr删除所有\r和\n字符,避免格式干扰:

lastLines="$(tail -n 2 _temp | tr -d $'\r\n')"
  • 使用-n 2是因为tail难以识别以^M开头、\n结尾的最后一行,取2行再过滤能确保获取到最新的进度信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 02:15:34