Como o curl imprime no terminal durante a canalização

3

Quando eu curl um arquivo e canalizo para um arquivo ou outro comando, vejo a saída no meu terminal. Não tenho certeza de como isso acontece, já que o pipe deve receber toda a saída da onda, certo?

Por exemplo:

$ curl http://www.archive.org/stream/Pi_to_100000000_places/pi.txt > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  129M    0  129M    0     0  22.5M      0 --:--:--  0:00:05 --:--:-- 24.7M

Editar

Eu uso o curl assim:

curl http://www.archive.org/stream/Pi_to_100000000_places/pi.txt | some_other_command > some_file

Eu não quero canalizar o status para some_other_command, eu só queria saber como ele foi capaz de exibir o status. No entanto, mostrando como redirecionar os dois fluxos adicionados à resposta, não remova isso.

    
por vikarjramun 10.08.2017 / 04:29

2 respostas

7

Existem dois fluxos de saída geralmente disponíveis: saída padrão e erro padrão. Na prática, quando executado em um terminal, ambos enviam dados para o terminal. > apenas redireciona a saída padrão e o curl imprime os dados de progresso para o erro padrão. Para suprimir ambos, use um dos seguintes:

curl ... > /dev/null 2>&1
curl ... &> /dev/null    # bash's combined redirection operator
curl -s ...    # -s, --silent: Silent or quiet mode. Don't show progress meter or error messages.

Para enviar ambos para um pipe:

curl ... 2>&1 | ...
curl |& ...    # bash's combined pipe

A menos que você use os operadores |& ou &> , todos os fluxos serão redirecionados independentemente.

Veja também:

por muru 10.08.2017 / 04:35
2

Quando você está usando curl para abrir uma URL, você terá duas saídas:

  1. O status do curl em si.
  2. O conteúdo desse URL.

O Curl deve usar uma maneira de mostrar esses dois separadamente, caso contrário, o processamento da saída real (conteúdo da URL) seria difícil e acabarei com conteúdo desnecessário (status de curl).

Por isso, usa stderr para o status e stdout para o conteúdo.

Usando > você está redirecionando o conteúdo da URL (stdout) para o /dev/null , na verdade você deve usar: 2> /dev/null .

Além disso, se você quiser enviar os dois para o próximo comando:

curl url |&  command

Se você quiser que o conteúdo seja canalizado para o próximo comando sem ver o status:

curl 2> /dev/null | command
    
por Ravexina 10.08.2017 / 04:38