web-dev-qa-db-ja.com

stdoutに書き込まれたwgetmangling出力は、-qでのみ機能します

python( http://Pastebin.com/mjLDk7Gk )で記述された最小限のHTTPサーバーがあり、ステータス200と本文「完了」ですべてのGETリクエストに応答するだけです。 。

私が行った場合

wget "http://localhost:9001" -O - -q
Done

しかし、-qを省略した場合:

wget "http://localhost:9001" -O - 
--2015-01-12 15:28:20--  http://localhost:9001/
Resolving localhost (localhost)... 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:9001... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified
Saving to: ‘STDOUT’

  [<=>                                                               ] 0           --.-K/s              D
  [ <=>                                                              ] 4           --.-K/s   in 0s      

2015-01-12 15:28:20 (670 KB/s) - written to stdout [4]
#blank line here

最初の「ステータスバー」行の終わりに「D」があります。これは実際には、目的の出力の最初の文字です。端末の更新中に出力がどこかで失われたと思います。これは、より長い応答ボディでも発生します。

別の観察:出力をファイルにリダイレクトすると、再び機能します:

 wget "http://localhost:9001" -O -  > /tmp/file
 cat /tmp/file
 Done

また、非常に幅の広い端末でも発生します。 「ステータスバー」は増え続けていますが、応答本文の文字はまだ1つしかありません。

これは私の側のどこかにあるバグまたは構成の誤りですか? gnome-terminalとxterm(Ubuntu 14.04.1 LTS)で同じ動作が得られます。

2
Jasper

一方では、-O -を使用して、受信したデータをwgetに書き込むようにstdoutに要求します。これは、バッファリングなしで実行します。一方、-qで抑制しない限り、wgetは進行状況情報をstderrに書き込みます。

> some_fileを使用して)ストリームの1つをリダイレクトしない場合、それらは両方とも端末によって同時に同時に表示されます。特にwgetは特殊文字を使用してステータスバーを表示するため、よく混ぜます。

あなたが期待するのはwgetから:

  1. 進捗状況を表示しながら、データを取得してどこかに保存します
  2. 次に、すべてが取得された後、データを表示します。

これは一時ファイルで行うことができます:

wget "http://localhost:9001" -O /tmp/some_file && cat /tmp/some_file

おそらく使用することもできます buffer

wget "http://localhost:9001" -O - | buffer -b 1 -s 100000
2
bwt