web-dev-qa-db-ja.com

パイピング中に端末にカールを印刷する方法

ファイルをcurlし、それをファイルまたは別のコマンドにパイプすると、ターミナルに出力が表示されます。パイプはcurlからのすべての出力を取得することになっているため、これがどのように起こるのかわかりません。

例えば:

$ 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

編集

次のようにcurlを使用します。

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

ステータスをsome_other_commandにパイプ処理したくありません。ステータスを表示する方法を知りたいだけです。ただし、回答に追加された両方のストリームをリダイレクトする方法を示すため、削除しないでください。

4
vikarjramun

一般に利用可能な2つの出力ストリームがあります。標準出力と標準エラーです。実際には、端末で実行する場合、両方が端末にデータを送信します。 >は標準出力のみをリダイレクトし、curlは進捗データを標準エラーに出力します。両方を抑制するには、次のいずれかを使用します。

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.

両方をパイプに送信するには:

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

|&または&>演算子を使用しない限り、すべてのストリームは個別にリダイレクトされます。

参照:

7
muru

curlを使用してURLを開くと、2つの出力が得られます。

  1. curl自体のステータス。
  2. そのURLの内容。

Curlでは、これら2つを別々に表示する方法を使用する必要があります。そうしないと、実際の出力(URLのコンテンツ)の処理が難しくなり、不必要なコンテンツ(カールのステータス)になります。

そのため、ステータスにはstderrを使用し、コンテンツにはstdoutを使用します。

>を使用すると、URLのコンテンツ(stdout)を/dev/nullにリダイレクトするため、実際には2> /dev/nullを使用する必要があります。

また、両方を次のコマンドに渡す場合:

curl url |&  command

ステータスを表示せずにコンテンツを次のコマンドにパイプするだけの場合:

curl 2> /dev/null | command
2
Ravexina