使用pv
,我可以显示通过它传输的任何内容的进度条,例如
echo 1234567890 | pv --size 10 >/dev/null
它会打印一个漂亮的进度条,每当有更多数据通过时,进度条就会更新(当然,在这个例子中应该非常快,但由于数据只到达,所以不是很有用/dev/null
)。
我可以以某种方式缩进 的输出吗pv
?想象一下这样的一个脚本,它浏览我派对的所有受邀者的列表,给他们打电话,与他们交谈,然后写入控制台,看看他们是否想参加派对:
echo "The next person on the list is Berta." ;\
echo " Calling Berta..."; \
echo " Berta answered the phone. Talking..."; \
printf " "; \
for word in TALK TALK TALK TALK TALK; do
printf $word; sleep 1;
done | pv --size 20 --width 100 >/dev/null; \
echo " Berta said she would come to the party."
如果你尝试一下,你会发现,第一的pv 进度条的输出将在 printf 打印的四个空白之后开始,但第一次更新将跳回到开头的行(可能带有 CR),之后导致以下输出:
The next person on the list is Berta.
Calling Berta...
Berta answered the phone. Talking...
20.0 B 0:00:05 [3.53 B/s] [======================================================>] 100% 0:01
Berta said she would come to the party.
有什么方法可以防止 pv(或任何其他发出 CR 的命令)跳回到行首?像示例这样的长时间运行的命令的输出如果缩进,可读性会更高。
答案1
特定于的解决方案pv
:使用-F
/--format
并在格式字符串中包含四个前导空格。
-F
,--format FORMAT
忽略选项-p
、-t
、-e
、-r
、-a
、-b
和,而是使用格式字符串-T
来确定输出格式。请参阅格式化部分 […]。-A
FORMAT
(来源:man 1 pv
)
我不会在这里引用格式化部分。请参阅man 1 pv
。
例子:
echo "The next person on the list is Berta." ;\
echo " Calling Berta..."; \
echo " Berta answered the phone. Talking..."; \
for word in TALK TALK TALK TALK TALK; do
printf '%s' "$word"; sleep 1;
done | pv -F ' %p' --size 20 >/dev/null; \
echo " Berta said she would come to the party."