指定したURLにアクセスすることができる便利なcurlコマンドで-oオプションの後ろに-(ハイフン)がついた -o- を目にすることがある。
例えば、node.jsのバージョン管理ツールであるnvmをインストールするときのコマンドで使われている。
(参考)github nvm
「-o」の意味はわかるけど、「-o-」とは何でどんな処理をしているかについて。
-o-とは何か?
-o- とは、オプション「o」の後ろに「-」がついたものです。指定したURLの中身をbashとして出力します。
細かく説明すると以下のようになります。
-oとは何か?
「-o」とは、ショートオプションであることを示す「-」にオプション「o」を指定したものです。
ショートオプションとはロングオプションの省略形です。ロングオプションにはハイフン2つ「--
」を使います。「-o」は「--output
」と同じです。
oオプションは、ファイル名を指定してダウンロードするときに使います。
curl -o <ファイル名> <URL>
例えば、以下のようにファイル名に~/desktop/test
を指定すると、指定したURLの内容がデスクトップにtestというファイル名でダウンロードされます。
curl -o ~/desktop/test https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh
▼実行結果の例
$ curl -o ~/desktop/test https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 14926 100 14926 0 0 49588 0 --:--:-- --:--:-- --:--:-- 49588
#ファイルが保存されたか確認
$ ls ~/desktop | grep test
test
ファイル名にハイフン「-」を指定する
この oオプションは後ろで指定するファイル名を「-」にする(ファイル名を指定しない状態)と、指定したURLの中身をbash(黒画面上)に出力する指示になります。
$ curl -o - https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh
#!/usr/bin/env bash
{ # this ensures the entire script is downloaded #
nvm_has() {
type "$1" > /dev/null 2>&1
}
nvm_echo() {
command printf %s\\n "$*" 2>/dev/null
}
###以下略
「-」の直前のスペースを省略する
ファイル名を指定しない「-」とした場合は、「-o」の後ろにスペースがあってもなくても同じ処理になります。
$ curl -o - URL
$ curl -o- URL
▼実行例
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh
#!/usr/bin/env bash
{ # this ensures the entire script is downloaded #
nvm_has() {
type "$1" > /dev/null 2>&1
}
nvm_echo() {
command printf %s\\n "$*" 2>/dev/null
}
###以下略
まとめ
まとめると、「-o-」は–outputオプションをショートオプションで指定した形で、指定したURLの中身をbashとして出力するという意味になります。
末尾に | bash
をつけることで、指定したURLの内容をbashとして実行する処理になります。
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
パイプ「A | B」はAの処理結果をBの引数として渡す処理です。
つまり、https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.shからダウンロードしてきたshファイルをbashとして実行する処理になります。
wgetの -qO- とは何か?
nvmのインストールコマンドには、curlの他にwgetを使って「-qO-」オプションを指定したものもあります。
(参考)github nvm
-qO-とは何か?
-q0- とは、2つのオプション「q」と「O」の後ろに「-」がついたものです。指定したURLの中身をbashとして出力しています。
細かく説明すると以下のようになります。
-qとは何か?
「-q」とは、ショートオプションであることを示す「-」にオプション「q」を指定したものです。
ショートオプションとはロングオプションの省略形です。ロングオプションにはハイフン2つ「--
」を使います。「-q」は「--quit
」と同じです。
qオプションは、ログファイルを出力しな指示になります。
Oとは何か?
「O」とは、ショートオプションの「O」を指しています。
「-O」は「--output-document=FILE
」と同じです。指定したファイルに、URLの内容を書き込む処理になります。
wget -O <ファイル名> <URL>
小文字のoは、ログの内容をファイルに書き込むオプションとなり O とは完全に異なるので注意してください(curlとは違います)
▼実行結果の例
例えば、以下のようにファイル名に~/desktop/test
を指定すると、指定したURLの内容がデスクトップにtestというファイル名でダウンロードされます。
$ wget -O ~/desktop/test https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh
--2021-07-05 14:00:30-- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh
raw.githubusercontent.com (raw.githubusercontent.com) をDNSに問いあわせています... 185.199.110.133, 185.199.111.133, 185.199.109.133, ...
raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 14926 (15K) [text/plain]
`/Users/desktop/test' に保存中
/Users/desktop/test 100%[==========================================================================================================================>] 14.58K --.-KB/s 時間 0.001s
2021-07-05 14:00:30 (26.9 MB/s) - `/Users/desktop/test' へ保存完了 [14926/14926]
ここでは、DNSを問い合わせています。やどこどこに保存中、保存完了といったログが出力されていますが、「-q」オプションを付ければ、これらが何も表示されなくなります。
▼実行結果の例(qオプションをつけた場合)
$ wget -O ~/desktop/test https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh
$
ファイル名にハイフン「-」を指定する
この Oオプションは後ろで指定するファイル名を「-」にする(ファイル名を指定しない状態)と、指定したURLの中身をbash(黒画面上)に出力する指示になります。
$ wget -qO - https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh
#!/usr/bin/env bash
{ # this ensures the entire script is downloaded #
nvm_has() {
type "$1" > /dev/null 2>&1
}
nvm_echo() {
command printf %s\\n "$*" 2>/dev/null
}
###以下略
「-」の直前のスペースを省略する
ファイル名を指定しない「-」とした場合は、「-o」の後ろにスペースがあってもなくても同じ処理になります。
$ wget -qO -
$ wget -qO-
▼実行例
$ wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh
#!/usr/bin/env bash
{ # this ensures the entire script is downloaded #
nvm_has() {
type "$1" > /dev/null 2>&1
}
nvm_echo() {
command printf %s\\n "$*" 2>/dev/null
}
###以下略
まとめ
まとめると、「-qO-」は--quite
オプションと --output-document=FILE
をショートオプションで指定した形で、指定したURLの中身をbashとして出力するという意味になります。
末尾に | bash
をつけることで、指定したURLの内容をbashとして実行する処理になります。
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
パイプ「A | B」はAの処理結果をBの引数として渡す処理です。
つまり、https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.shからダウンロードしてきたshファイルをbashとして実行する処理になります。