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


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

Eu acho que você quer dizer stdoutna sua primeira frase? Além disso, tudo isso faz sentido.
Jasper

você está certo. resposta corrigida
bwt
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.