【发布时间】:2017-04-24 18:38:00
【问题描述】:
我正在寻找一个 bash sn-p 来限制可能变得过于冗长的 shell 命令的控制台输出量。
这样做的目的是在构建/CI 环境中使用,您确实希望限制控制台输出的数量,以防止 CI 服务器过载(甚至是客户端拖尾输出)。
全部要求:
- 仅从命令输出的顶部(头部)开始最多显示 100 行
- 从命令输出的底部(尾部)最多只显示 100 行
- 将
stdout和stderr全部归档到command.log.gz文件中 - 控制台输出必须相对实时显示,最后输出结果的解决方案是不可接受的,因为我们需要能够看到它的执行进度。
目前的发现
-
unbuffer可用于强制 stdout/stderr 无缓冲 -
|& tee可用于将输出发送到归档器和尾部/头部 -
|& gzip --stdout >command.log.gz可以存档控制台输出 -
head -n100和tail -n100可用于限制控制台输出,如果输出行数低于 200,它们至少会引入一些问题,例如不希望的结果。
【问题讨论】:
-
[ -f command.log.gz ] && gunzip command.log.gz; somecommand > tmp && (( $(wc -l <tmp) > 100 )) && { head -n100 tmp; tail -n100 tmp; } || cat tmp; cat tmp >> command.log; gzip command.log; rm tmp