Answers:
yourcommand | { I=0; while read; do printf "$((++I))\r"; done; echo ""; }
或将带括号的部分放在shell脚本中。请注意,这仅在您的shell实际上支持preincrement运算符(例如bash或ksh93或zsh)时才有效。否则,您将不得不增加$I
然后打印它(如中所述I=$((I+1));printf...
)。另外,如果printf
您的shell不是内置的(它是当前bash的内置),则可以使用echo -ne
或print -n
来提高性能。您只想取消换行符,并将\ r解释为转义字符。
printf
结尾的原因\r
。如果你这样做echo -ne "$I\r"
或会发生什么呢print -n "$I\r"
?:) printf
但是,我使用了它,因为它默认情况下不在末尾打印换行符,因此\r
只是移回开头。不幸的是,并非所有的echo实现都支持-e
or -n
参数。
read
为read -r
(因为否则行尾的反斜杠会影响计数)。顺便说一句,只需做一些工作,就可以使其显示最新的输出行,这对于某些命令可能很有用。
这是一个大概的主意,但是您可以使用该pv
命令计算行数,并将其显示在屏幕上。 pv
在它的许多交换机中,有一个-l
交换机在对通过的每一行进行计数。
在这里,我使用while循环来模拟SVN输出中的某些文件。
$ for i in $(seq 100); do echo "file$i"; sleep 2; done | pv -l -c >/dev/null
3 0:00:05 [0.99/s ] [ <=>
它将继续覆盖输出行,如下所示:
18 0:00:36 [ 0/s ] [ <=> ]
24 0:00:47 [0.991/s ] [ <=> ]
您可以在后台将命令作为作业运行,并将其stdout(和stderr(可选))重定向到日志文件:command > logfile &
在其中&
指定作业(如果也是stderr,请说&>
而不是>
)。
然后,您可以使用wordcount实用工具使用来计数日志文件中的行数wc -l
。
为了在一条动态变化的行中显示状态的变化,可以使用,例如while true; do echo -en '\r'; wc -l logfile; sleep 1; done
,但是我不能强迫bash绘制\r
回车符来杀死前一行的内容。
看到这个问题,它几乎是重复的:https : //stackoverflow.com/questions/2388090/how-to-delete-and-replace-last-line-in-the-terminal-using-bash
printf/print/echo
danny提出的结果淹没他的屏幕。:)当然,他可以使用less
,但是我想,只要wc -l logfile
他不耐烦,他就可以说。我认为,在ncurses
这里玩或清除屏幕实在是太过分了。
echo -e 'r'
命令吗?它应该擦除行的先前打印的内容,以便它可以动态更改,但是我不能强迫它这样做:(
=
和`=`差异和怪癖。:)为什么他们不将其替换为类似python的语法语言...