unix copy/download 进度状态更新
unix copy/download progress status update
当我们scp
文件从一台机器到另一台机器。它为我们提供进度状态,其中包括以下信息:percentage completed
、upload rate
和 time 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。存在不同的库以一种可移植的方式处理这些问题:curses
、ncurses
等,至少在类 Unix 世界中是这样。
当我们scp
文件从一台机器到另一台机器。它为我们提供进度状态,其中包括以下信息:percentage completed
、upload rate
和 time 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。存在不同的库以一种可移植的方式处理这些问题:curses
、ncurses
等,至少在类 Unix 世界中是这样。