我正在将svn export
其用作应用程序打包脚本的一部分,看起来这个命令与许多其他命令一样,没有任何类型的进度条。
我现在有两个选择:
- 在没有选项的情况下使用它,并观察它打印数千行
- 使用
--quiet
,并且在完成之前不会看到任何内容。
有没有办法至少实时显示命令输出的行数?例如:
Exporting SVN directory ... 1234 files
并且看到这个数字1234
实时增量?我可以想象将输出通过管道传输到一个命令来执行此操作,但是哪个命令呢?
答案1
yourcommand | { I=0; while read; do printf "$((++I))\r"; done; echo ""; }
或者将括号内的部分放入 shell 脚本中。请注意,只有当您的 shell 实际上支持预增量运算符(例如 bash、ksh93 或 zsh)时,这才有效。否则,您将必须递增$I
然后打印它(如 中所示I=$((I+1));printf...
)。另外,如果printf
不是您的 shell 的内置函数(它是当前 bash 的内置函数),您可以使用echo -ne
或print -n
来代替以获得更好的性能。您只想抑制换行符并将 \r 解释为转义字符。
答案2
这是一个粗略的想法,但您可以使用该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 ] [ <=> ]
答案3
您可以在后台将命令作为作业运行,并将其 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