1

У меня есть минимальный HTTP-сервер, написанный на python (http://pastebin.com/mjLDk7Gk), который просто отвечает на каждый запрос GET со статусом 200 и телом "Done".

Если я сделаю

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

Это также происходит с очень широкими терминалами. "Строка состояния" растет, но в теле ответа остается только один символ.

Это ошибка или ошибка конфигурации где-то на моей стороне? Я получаю идентичное поведение с gnome-terminal и xterm (в Ubuntu 14.04.1 LTS).

1 ответ1

1

С одной стороны, с помощью -O - вы запрашиваете wget записать полученные данные в стандартный stdout , что происходит без буферизации. С другой стороны, и если вы не подавите его с помощью -q , wget записывает информацию о прогрессе в stderr .

Если вы не перенаправите один из потоков (используя > some_file), они оба будут отображаться терминалом одновременно , и они плохо смешиваются, особенно потому, что wget использует специальные символы для отображения строки состояния.

Что вы ожидаете, так это для wget :

  1. Извлекайте данные и сохраняйте их где-нибудь, отображая статус выполнения
  2. Затем, после того, как все было получено, отобразите данные.

Вы можете сделать это с временным файлом:

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

Вы также можете использовать буфер :

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .