curlコマンドのマニュアルを読んだ

curlコマンドのマニュアルを読んだのでまとめます。
英語は得意ではないので解釈が間違っていたらすみません。
#書式
curl [option] URL

#説明
curlはサーバー間で1つのプロトコルを使いデータをやり取りする。
サポートしているプロトコル:
```DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS,  LDAP,  LDAPS,  POP3,  POP3S,  RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP```
curlの転送関連にはlibcurlが使われている。[libcurl(英語)](https://curl.se/libcurl/)

#URL
URLの構文はプロトコルによって依存する。詳しくはRFC 3986を見てと書いてある。
[RFC 3986](https://triple-underscore.github.io/rfc-others/RFC3986-ja.html)。長いので時間のある時にでも。

URLは以下のように中括弧を使って複数指定することができる。

```
http://site.{one,two,three}.com
```
###シーケンス
また、```[]``` を使うと英数字を使ってシーケンスを表現できる。
シーケンスをネストすることはできないが、{}, []を組み合わせることができる。

```
ftp://ftp.sample.com/file[1-100]

ftp://ftp.sample.com/file[a-z]

ftp://ftp.sample.com/file[a[abc]b]  ←これはできない

ftp://ftp.{test,sample}.com/dir[1-9]/file[001-100].txt
```
最後の行のように```001-100```とした場合、0も読み込まれるからfile001などにマッチする。

下記のように書くとステップカウンターというらしくセミコロンを使って指定したN番目ごとの数値を取得できるらしい。(よくわからない)

```
ftp://ftp.sample.com/file[1-10:3]
```
####URLのエスケープ
{}や[], ?, *などをエスケープする場合、URL全体を二重引用符(")で囲う。

**IPv6についての説明も載っていましたが、そんなに詳しくないのでIPv6を勉強してから改めて載せなおします。**

###プロトコルを省略した場合
使おうとしているプロトコルを推測してくれる。デフォルトはHTTPだが、使用頻度の高いホスト名に基づいて推測されます。

###コネクションの再利用
データを転送する際にコネクションを再利用するためあまりにファイルが多い場合は利用できない。
だが、コネクションの再利用によって転送速度が向上している。
コネクションは単一のコマンドでのみ再利用される(個別のcurl間では利用されない)。

#進歩状況
###表示のされ方
curlコマンドは操作中、データの転送量や転送速度、残り時間などの進歩状況を表示します。
進歩状況はバイト単位で表示されます。(転送速度は```bytes/second```で表される)

さらに、単位は1024バイトを元にしている。ex) ```1k=1024, 1M=1048576```

curlはデータをデフォルトとしてターミナルに表示する。しかし端末にデータが書き込まれる場合、進歩状況と出力されるデータが混ざってしまうため進歩状況の表示は無効になります。

###HTTPのPOSTとPUTにおける進歩状況の表示
HTTPのPOSTとPUTリクエストで進歩状況を表示したい場合は、シェルのリダイレクト
```(>)```や```-o, --output```オプションを使う。

 FTPの場合はこの操作ができないため、ターミナルに出力される。

###進歩状況をバーに変える方法
進歩状況をバー(bar)に変えたい場合、```--progress-bar, -£```(ポンドはoption+3)を使う。

###表示しない方法
進歩状況を非表示にしたい場合、```-s, --silent```を指定する。

#オプション
curlコマンドのオプションはとても多いし、まとめている人も多いので参考になる記事を載せます。

https://qiita.com/takayukioda/items/edf371b3566bea64d046

https://qiita.com/ryuichi1208/items/e4e1b27ff7d54a66dcd9

詳細が知りたい場合は頑張ってマニュアルを読んでください。(見た感じ1000行くらいはありました。)

#ファイル
デフォルトの設定ファイルは```~/.curlrc```です。```-K, --config```で詳細を見れます。

#環境変数

###仕様
環境変数は大文字か小文字で指定できます。(envとENVが存在する場合は小文字が優先される)
しかし```http_proxy```は例外で小文字でのみ利用可能です。

環境変数を利用してプロキシを設定すると、```-x, --proxy```オプションと同様の挙動をします。

###変数一覧
・```http_proxy [protocol://]<host>[:port] ```
HTTPで使用するプロキシサーバーを設定する。

・```HTTPS_PROXY [protocol://]<host>[:port]```
HTTPSで使用するプロキシサーバーを設定する。

・```[url-protocol]_PROXY [protocol://]<host>[:port]```
[url-protocol]のプロキシサーバーを設定します。ここで指定できるのはcurlがサポートしているプロトコルであり```FTP, FTPS, POP3, IMAP, SMTP, LDAP```などです。

・```ALL_PROXY [protocol://]<host>[:port]```
プロトコル固有のプロキシが設定されていない場合に使用するプロキシサーバーを設定する。

・```NO_PROXY <comma-separated list of hosts/domains>```
プロキシを経由してはいけないホスト名のリスト。アスタリスク「*」のみ指定すると全てのホストネームにマッチする。
このリスト内のホスト名は、ホスト名を含むドメイン名かそのホスト名自体にマッチする。(IPアドレスを指定することもできる。その場合IPv6は括弧なしで指定する必要がある。)
また、-x, --proxyオプションでこの環境変数を指定した場合もプロキシの使用を無効にする。

#プロキシ・プロトコル
curlのバージョン7.21.7からプレフィックスを```protocol://```とするとプロキシプロトコルを指定できます。
プロキシ文字列にプロトコルが設定されていない場合、もしくはサポートしているプロキシと一致しない場合はHTTPプロキシとして扱われます。

###サポートされているプロキシプロトコル
・http://
・https://
・socks4://
```--socks4``` と同じ。
・socks4a://
```--socks4a``` と同じ。
・socks5://
```--socks5 と同じ。```
・socks5h://
```--socks5-hostname``` と同じ。

#exitコード
様々なコードがありますが、この記事の執筆時でのexitコードは以下の通りです。
 
1 : サポートされていないプロトコル
2 : 初期化に失敗しました
3 : URLの構文が正しくありません
4 : 実行に必要なオプションなどが指定されていないか、ビルド時に無効になった。
ビルド時に無効になった場合、別のlibcurlのビルドが必要です
5 : プロキシを解決できませんでした
6 : ホストを解決できませんでした
7 : ホストへの接続が失敗しました
8 : サーバーの応答が変です。(サーバーデータがcurlの解析をできませんでした)
9 : FTPのアクセスが拒否されました。サーバがログインもしくはアクセスを拒否しています。
10 : FTPの受け入れに失敗しました。FTPセッション使用中にサーバが接続し直すのを待っている間にエラーコードが送信されました。
...

確認したところ92番までありこの記事ではまとめられないので、マニュアルをご参照ください。
93番以降は今後リリースされるらしいです。

#Authors/Contributers
Daniel Stenberg(ダニエル・ステンバーグ)が主な著者です。貢献者のリストは別のTHANKSファイルにあります。

#curlのサイト
https://curl.se/

#最後に
英語の翻訳ミスがあったらすみません。
誰かの役に立てたら幸いです。^_^

**間違いなどございましたらご指摘ください**