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