当我们scp
文件从一台机器到另一台机器时。它为我们提供了进度状态,其中包括以下信息: percentage completed
, upload rate
和 time to finish
.当您使用-O
选项下载文件时,curl
也会发生同样的事情。
我的问题:通常输出(STDOUT(本质上是静态的,但此状态栏会不断更新in-place
。命令提示符如何实现此逻辑?
我的猜测:他们清除了行并再次重写,我正在寻找更多信息。(我可能是错的(。
通过使用回车符 (control-M( 而不是行之间的换行符非常简单地完成此操作。 您可以自己尝试:
echo -e 'abcdefrxxx'
其中r
通常是如何在字符串中输入回车。 上述命令在您的终端上显示为xxxdef
,因为回车移回行首,不下一行,覆盖开头的"ABC"。
您可以通过将输出捕获到文件中并查看数据来检查 scp
命令的这一点。例如:
script -c 'scp /a/very/big/file someremote:'
将创建一个带有进度行副本的文件typescript
。您可以使用以下命令查看此文件中的控制字符
cat -vet typescript
这将回车符显示为^M
,即控制-M,换行符显示为$
。
这通常是通过转义序列完成的,这些序列可以控制终端的不同功能。例如,请参阅 ANSI 转义代码。存在不同的库以可移植的方式处理这些:curses
、ncurses
等,至少在类Unix世界中是这样。