wget saída de mangling escrita para stdout, funciona apenas com -q

1

Eu tenho um servidor HTTP mínimo escrito em python ( link ) que simplesmente responde a todas as solicitações GET com status 200 e corpo "Concluído".

Se eu fizer

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

Mas se eu deixar de fora o -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

No final da primeira linha "status bar" existe um "D", é de fato o primeiro caractere da saída desejada. Eu suponho que a saída está em algum lugar perdido ao atualizar o terminal. Isso também acontece com corpos de resposta mais longos.

Outra observação: se eu redirecionar a saída para um arquivo, ele funcionará novamente:

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

Também acontece com terminais muito largos. A "barra de status" está crescendo, mas ainda há apenas um caractere do corpo da resposta.

Isso é um bug ou uma falha de configuração em algum lugar do meu lado? Eu tenho um comportamento idêntico ao gnome-terminal e xterm (no Ubuntu 14.04.1 LTS).

    
por Jasper 12.01.2015 / 15:32

1 resposta

1

Por um lado, com -O - , você está solicitando que wget grave os dados recebidos em stdout , o que faz sem buffer . Por outro lado, e a menos que você o suprima com -q , wget grava informações de progresso em stderr .

Se você não redirecionar um dos fluxos (usando > some_file ), eles serão exibidos simultaneamente pelo terminal, e eles não se misturam bem, especialmente porque wget usa caracteres especiais para exibir a barra de status.

O que você espera é de wget para:

  1. Recupere os dados e armazene-os em algum lugar, enquanto exibe o status do progresso
  2. Depois de tudo ter sido recuperado, exiba os dados.

Você pode fazer isso com um arquivo temporário:

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

Você provavelmente também pode usar o buffer :

wget "http://localhost:9001" -O - | buffer -b 1 -s 100000
    
por 13.01.2015 / 11:59