Homebrewのインストールコマンドがやっていること

# コマンドは何をやっているの？
コンピューターの操作に慣れているものの、ターミナルからの操作に慣れていない人にとっては、コピペして実行するだけだとしても、不安です。

そのため、Homebrewのインストールコマンドだけではなく、ターミナルを使った操作への抵抗感の払拭になればと思います。

# Homebrewとは
MacOSやLinuxでよく利用されるパッケージマネージャーです。新しくコンピュータを買ったら、まずインストールすることになる必須のツールですね。

https://brew.sh/ja/

# Homebrewインストール方法
インストールは非常に簡単で、下記のコマンドをターミナルを起動してコピペ、実行するだけです。

```zsh: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`が自動的にインストールされる。

https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh

# シェルって何？

下記の動画では、約６分と短い時間で非常に分かりやすくまとめてあるので、シェルやカーネルという単語に馴染みがない人は見てください。

IT入門チャンネル様：【6分で解説】Linux入門｜シェル＆カーネルを説明できますか？（sh、bash、tcsh）

https://youtu.be/VnxTw6eaN4c?si=J6jLeToKLbnztdvp

# コマンドの説明
コマンドを前半と後半に分けて説明してきます。

前半：Bashシェルを実行している部分
後半：スクリプトをダウンロードしている部分

```zsh:コマンドの構成:前半
/bin/bash -c "$([command])"
```

```zsh:コマンドの構成:後半
curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh
```

## 前半：Bashシェルを実行している部分
この前半のコマンドは、主にBashと呼ばれるシェルを起動する役割があります。また、直後に`-c`がオプションとして指定されているので、後続の文字列を`Bash`上で実行します。

```zsh:前半部
/bin/bash -c "$([command])"
```
・`/bin/bash`：`Bash`シェルの実行
・`-c`：直後の文字列をコマンドとして実行
・`$([command])`：コマンド置換を表し、中のコマンドを実行します。

### 例1.Bashで任意の文字列を出力するコマンド

最小限の例として、次のコマンドを実行して挙動を確認できます。

 ```zsh:"Hello,World" と出力するコマンド
 /bin/bash -c "echo Hello, World"
 ```

1.`Bash`シェル を起動
2.`echo`コマンドで"Hello, World"を出力

### 例2.任意の文字列の出力コマンド
ちなみに、上記の文字列部のみでも任意の文字列を出力できます。
```zsh:Bashを使わない場合
echo Hello, World
```

### 前半のまとめ

前半部では、Bashシェルを起動して、直後の文字列を実行していることがわかりました。

## 後半

この後半コマンドは、"https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh" というURLからシェルスクリプトをダウンロードし、出力します。

```bash:後半：スクリプトをダウンロードしている部分
curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh
```

・`curl`：URLからデータを取得したり、データを送信したりするために使用されます。
・`-fsSL`：`curl`用のオプションを合体させたものです。
     - `-f`: HTTPリクエストが失敗した場合にエラーを出す
     - `-s`: サイレントモード（プログレスメーターやエラーメッセージを表示しない）
     - `-S`: `-s`と一緒に使うと、エラーがあった場合にエラーメッセージを表示する
     - `-L`: リダイレクトをたどる

### もし、後半部だけ実行したら？
別に後半部だけでも、インストールスクリプトがダウンロードされるので、いいじゃないか。という気持ちもわかります。

しかし、実行してみると挙動が違うことを確認できます。`Homebrew`インストールスクリプトが、出力されるだけという結果になります。

```zsh:後半部だけ実行してみる
curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh
```

```bash:ターミナルに出力された内容
#!/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シェルを実行している部分
後半：スクリプトをダウンロードしている部分

```zsh:コマンドの構成:前半
/bin/bash -c "$([command])"
```

```zsh:コマンドの構成:後半
curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh
```

## 実行の流れ
1.`curl`コマンドでインストールスクリプトをダウンロードして出力

```zsh:Homebrewインストールスクリプトを出力
curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh
```

2.その出力がコマンドとして置換
```zsh:イメージ
[command] = Homebrewインストールスクリプト(install.shの中身)
```

3.コマンドを'Bash'シェルで実行

```zsh:Bashを起動しスクリプトを実行
/bin/bash -c "$([command])"
```

# 参考文献
https://brew.sh/ja/

https://www.youtube.com/watch?v=VnxTw6eaN4c