管道传输时调整curl输出:实现右移4空格并保留动态更新
解决curl输出缩进并保留动态进度更新的方法
问题根源
- curl的动态进度行依赖
\r(回车符)回到行首覆盖内容,默认的read命令会缓冲输入直到换行,导致进度行延迟显示 - 直接替换
\r为换行符会破坏动态更新特性,变成冗余的多行输出
正确实现命令
使用stdbuf关闭缓冲,结合awk逐字符处理,既实现4空格缩进,又保留进度行的动态更新效果:
curl -O <url> 2>&1 | stdbuf -i0 -o0 awk '{ for (i=1; i<=length($0); i++) { c = substr($0, i, 1) if (c == "\r") { printf "\r " } else { printf "%s", c } } printf "\n" }'
原理拆解
stdbuf -i0 -o0:关闭curl和awk的输入输出缓冲,确保每一个字符都被实时处理,避免进度延迟awk逐字符处理逻辑:- 遇到
\r时,先输出\r回到行首,紧接着输出4个空格,保证后续更新的进度内容从缩进位置开始覆盖 - 普通字符直接输出,完全保留原始内容的格式、换行等特性
- 每行末尾补换行符,处理正常的非进度输出行
- 遇到
替代方案(无stdbuf时)
如果系统没有stdbuf工具,可以用unbuffer(需安装expect包)替代:
curl -O <url> 2>&1 | unbuffer awk '{ for (i=1; i<=length($0); i++) { c = substr($0, i, 1) if (c == "\r") { printf "\r " } else { printf "%s", c } } printf "\n" }'
内容的提问来源于stack exchange,提问作者Silverspur
相关产品推荐
相关产品推荐

