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

2

Eu tenho um servidor HTTP mínimo escrito em python ( http://pastebin.com/mjLDk7Gk ) que simplesmente responde a todas as solicitações GET com status 200 e corpo "Done".

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 de "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).

Jaspe
fonte
Tem certeza de que não é o terminal truncando em vez de envolver a saída?
Nifle
Por favor, veja a resposta atualizada.
Jasper

Respostas:

2

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

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

O que você espera é wget:

  1. Recupere os dados e armazene-os em algum lugar, enquanto exibe o status do progresso
  2. Então, depois que tudo tiver 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
bwt
fonte
Eu acho que você quer dizer stdoutna sua primeira frase? Além disso, tudo isso faz sentido.
Jasper
você está certo. resposta corrigida
bwt