使用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
相关产品推荐
相关产品推荐

