如何实时显示命令输出的行数?

Ben*_*rel 18 shell pipe progress-information

我将其svn export用作我的应用程序的打包程序脚本的一部分,看起来这个命令与许多其他命令一样,没有任何类型的进度条。

目前我有两个选择:

  • 不加选项地使用它,并观察它打印数千行
  • 使用--quiet,并且在完成之前什么也看不到。

有没有办法至少实时显示命令输出的行数?如:

Exporting SVN directory ... 1234 files
Run Code Online (Sandbox Code Playgroud)

1234 实时看到这个数字增量?我可以想象将输出传递给一个可以做到这一点的命令,但是哪个呢?

dan*_*uer 19

yourcommand | { I=0; while read; do printf "$((++I))\r"; done; echo ""; }
Run Code Online (Sandbox Code Playgroud)

或者将括号内的部分放在 shell 脚本中。请注意,这仅在您的 shell 实际支持预增量运算符(如 bash 或 ksh93 或 zsh)时才有效。否则,您将不得不增加$I然后打印它(如I=$((I+1));printf...)。此外,如果printf不是您的 shell 的内置程序(它是当前 bash 的内置程序),您可以使用echo -neprint -n来代替以获得更好的性能。您只想取消换行符并将 \r 解释为转义字符。


slm*_*slm 7

这是一个粗略的想法,但您可以使用该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 ] [      <=>             
Run Code Online (Sandbox Code Playgroud)

它将像这样继续覆盖输出行:

  18 0:00:36 [   0/s ] [                                     <=>                                                                  ]

  24 0:00:47 [0.991/s ] [                                                <=>                                                      ]
Run Code Online (Sandbox Code Playgroud)


Bor*_*kov 0

您可以在后台将命令作为作业运行,并将其 stdout(以及可选的 stderr)重定向到日志文件:command > logfile &其中&指定作业(如果也是 stderr,&>则使用>)。

然后,您可以使用 wordcount 实用程序来计算日志文件中的行数wc -l

要显示动态变化的行中的状态变化,您可以使用类似的东西while true; do echo -en '\r'; wc -l logfile; sleep 1; done,但我不能强制 bash 绘制\r回车符来杀死前一行的内容。

看到这个问题,它几乎是重复的:/sf/ask/167166331/