コマンドは何をやっているの?
コンピューターの操作に慣れているものの、ターミナルからの操作に慣れていない人にとっては、コピペして実行するだけだとしても、不安です。
そのため、Homebrewのインストールコマンドだけではなく、ターミナルを使った操作への抵抗感の払拭になればと思います。
Homebrewとは
MacOSやLinuxでよく利用されるパッケージマネージャーです。新しくコンピュータを買ったら、まずインストールすることになる必須のツールですね。
Homebrewインストール方法
インストールは非常に簡単で、下記のコマンドをターミナルを起動してコピペ、実行するだけです。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
ここまでは公式ドキュメントにも記載された内容に従うだけで、インストールが完了します。
インストールの流れ
このコマンドは、https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh
というURLからシェルスクリプトをダウンロードし、その内容をBashシェルで実行します。
実行されるスクリプトは、Homebrewのインストールに必要な手順を自動で行うように書かれているので、全体コマンドをコピぺするだけで良かったんですね。
1.Bashシェル
を起動
2.Homebrew
のインストールスクリプトをダウンロード
3.スクリプトが実行され、Homebrew
が自動的にインストールされる。
シェルって何?
下記の動画では、約6分と短い時間で非常に分かりやすくまとめてあるので、シェルやカーネルという単語に馴染みがない人は見てください。
IT入門チャンネル様:【6分で解説】Linux入門|シェル&カーネルを説明できますか?(sh、bash、tcsh)
コマンドの説明
コマンドを前半と後半に分けて説明してきます。
前半:Bashシェルを実行している部分
後半:スクリプトをダウンロードしている部分
/bin/bash -c "$([command])"
curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh
前半:Bashシェルを実行している部分
この前半のコマンドは、主にBashと呼ばれるシェルを起動する役割があります。また、直後に-c
がオプションとして指定されているので、後続の文字列をBash
上で実行します。
/bin/bash -c "$([command])"
・/bin/bash
:Bash
シェルの実行
・-c
:直後の文字列をコマンドとして実行
・$([command])
:コマンド置換を表し、中のコマンドを実行します。
例1.Bashで任意の文字列を出力するコマンド
最小限の例として、次のコマンドを実行して挙動を確認できます。
/bin/bash -c "echo Hello, World"
1.Bash
シェル を起動
2.echo
コマンドで"Hello, World"を出力
例2.任意の文字列の出力コマンド
ちなみに、上記の文字列部のみでも任意の文字列を出力できます。
echo Hello, World
前半のまとめ
前半部では、Bashシェルを起動して、直後の文字列を実行していることがわかりました。
後半
この後半コマンドは、"https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh" というURLからシェルスクリプトをダウンロードし、出力します。
curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh
・curl
:URLからデータを取得したり、データを送信したりするために使用されます。
・-fsSL
:curl
用のオプションを合体させたものです。
- -f
: HTTPリクエストが失敗した場合にエラーを出す
- -s
: サイレントモード(プログレスメーターやエラーメッセージを表示しない)
- -S
: -s
と一緒に使うと、エラーがあった場合にエラーメッセージを表示する
- -L
: リダイレクトをたどる
もし、後半部だけ実行したら?
別に後半部だけでも、インストールスクリプトがダウンロードされるので、いいじゃないか。という気持ちもわかります。
しかし、実行してみると挙動が違うことを確認できます。Homebrew
インストールスクリプトが、出力されるだけという結果になります。
curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh
#!/bin/bash
# We don't need return codes for "$(command)", only stdout is needed.
# Allow `[[ -n "$(command)" ]]`, `func "$(command)"`, pipes, etc.
# shellcheck disable=SC2312
set -u
abort() {
printf "%s\n" "$@" >&2
exit 1
}
# Fail fast with a concise message when not using bash
# Single brackets are needed here for POSIX compatibility
# shellcheck disable=SC2292
if [ -z "${BASH_VERSION:-}" ]
.
.
.
EOS
install.shの中身をターミナルに出力しているだけでした。これが実行される訳ではありませんね。
後半まとめ
後半部では、curl
コマンドで指定したURLからインストール用スクリプトをダウンロードして出力していることがわかりました。-fsSL
をオプションに指定することで、問題発生への配慮もありました。
まとめ
前半と後半に説明した内容を組み合わせることで、Homebrewを自動的にインストールしていることがわかりました。
コマンド構成
前半:Bashシェルを実行している部分
後半:スクリプトをダウンロードしている部分
/bin/bash -c "$([command])"
curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh
実行の流れ
1.curl
コマンドでインストールスクリプトをダウンロードして出力
curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh
2.その出力がコマンドとして置換
[command] = Homebrewインストールスクリプト(install.shの中身)
3.コマンドを'Bash'シェルで実行
/bin/bash -c "$([command])"
参考文献