wget 的 stderr 在写入屏幕时与写入文件时看起来如此不同

where is stderr of wget look so different when writing to screen than to a file

例如,当使用 wget

$ wget https://pypi.python.org/packages/source/F/Flask/Flask-0.10.1.tar.gz

输出看起来像

--2016-03-05 20:01:58--  https://pypi.python.org/packages/source/F/Flask/Flask-0.10.1.tar.gz
Resolving pypi.python.org (pypi.python.org)... 199.27.74.223
Connecting to pypi.python.org (pypi.python.org)|199.27.74.223|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 544247 (531K) [application/octet-stream]
Saving to: ‘Flask-0.10.1.tar.gz’

100%[====================================================================================================================================================================================================>] 544,247     2.38MB/s   in 0.2s   

2016-03-05 20:01:59 (2.38 MB/s) - ‘Flask-0.10.1.tar.gz’ saved [544247/544247]

但是当我将它重定向到日志时

$ wget https://pypi.python.org/packages/source/F/Flask/Flask-0.10.1.tar.gz &> tmp.log
$ cat tmp.log 
--2016-03-05 20:02:54--  https://pypi.python.org/packages/source/F/Flask/Flask-0.10.1.tar.gz
Resolving pypi.python.org (pypi.python.org)... 199.27.74.223
Connecting to pypi.python.org (pypi.python.org)|199.27.74.223|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 544247 (531K) [application/octet-stream]
Saving to: ‘Flask-0.10.1.tar.gz.3’

     0K .......... .......... .......... .......... ..........  9%  443K 1s
    50K .......... .......... .......... .......... .......... 18%  409K 1s
   100K .......... .......... .......... .......... .......... 28%  433K 1s
   150K .......... .......... .......... .......... .......... 37%  374K 1s
   200K .......... .......... .......... .......... .......... 47%  374K 1s
   250K .......... .......... .......... .......... .......... 56%  338K 1s
   300K .......... .......... .......... .......... .......... 65%  337K 0s
   350K .......... .......... .......... .......... .......... 75%  241K 0s
   400K .......... .......... .......... .......... .......... 84%  346K 0s
   450K .......... .......... .......... .......... .......... 94%  384K 0s
   500K .......... .......... .......... .                    100%  693K=1.4s

2016-03-05 20:02:55 (369 KB/s) - ‘Flask-0.10.1.tar.gz.3’ saved [544247/544247]

我很好奇,想知道写入屏幕时发生了什么? 这些等号的增量出现是如何成为可能的,以及在哪里 重定向到日志后它们消失了吗?

wget 在 stderr 上调用 isatty() 来决定是否显示增量等号下载进度条。这很方便,原因有很多,因为我们可以发送终端控制字符来备份和擦除该行并重写它。这是在写入文件时通过不同的机制完成的,而在写入管道时则不可能。