unix copy/download 进度状态更新

unix copy/download progress status update

当我们scp文件从一台机器到另一台机器。它为我们提供进度状态,其中包括以下信息:percentage completedupload ratetime to finish。当您使用 -O 选项下载文件时,curl 也会发生同样的事情。

我的问题: 通常输出(STDOUT)本质上是静态的,但是这个状态栏不断更新in-place.命令提示符是如何实现这个逻辑的?

我的猜测:他们清除了行并再次重写,我正在寻找更多信息。 (我可能是错的)。

这非常简单,只需使用回车符-return 字符(control-M)而不是行间换行符即可。您可以自己尝试:

echo -e 'abcdef\rxxx'

其中 \r 是通常在字符串中输入 carriage-return 的方式。上面的命令在您的终端上显示为 xxxdef 因为回车 -return 已经回到行首,没有下一行,并覆盖了开头的 "abc"。

您可以通过将输出捕获到文件中并查看数据来检查 scp 命令的这一点。例如:

script -c 'scp /a/very/big/file someremote:'

将创建一个包含进度条副本的文件 typescript。您可以使用

查看此文件中的控制字符
cat -vet typescript

这会将回车符-returns 显示为 ^M,即 control-M,换行符显示为 $.

这通常是通过通过 转义序列完成的,字符序列可以控制终端的不同功能。例如,参见 ANSI escape code。存在不同的库以一种可移植的方式处理这些问题:cursesncurses 等,至少在类 Unix 世界中是这样。