# 画面設計書 17-install.sh

## 概要

本ドキュメントは、Oh My Zshをインストールするスクリプト `install.sh` の画面設計書です。

### 本画面の処理概要

`install.sh` は、Oh My Zshをシステムに新規インストールするためのシェルスクリプトです。

**業務上の目的・背景**：Oh My Zshはzshのフレームワークであり、新規ユーザーが簡単にセットアップできることが重要です。本スクリプトは、リポジトリのクローン、設定ファイルの作成、デフォルトシェルの変更など、インストールに必要な全ての手順を自動化します。curl/wget/fetchを使用したワンライナーインストールをサポートし、初心者でも簡単にOh My Zshを導入できます。

**画面へのアクセス方法**：以下のいずれかの方法で実行します：
- `sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"`
- `sh -c "$(wget -qO- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"`
- ローカルに保存して `sh install.sh`

**主要な操作・処理内容**：
1. 環境変数の設定と引数の解析
2. zshがインストールされているか確認
3. $ZSHディレクトリが存在しないか確認
4. gitを使用してOh My Zshリポジトリをクローン
5. .zshrcファイルの作成（既存ファイルのバックアップ）
6. デフォルトシェルをzshに変更（オプション）
7. 成功メッセージの表示
8. 新しいzshセッションの起動（オプション）

**画面遷移**：
- 遷移元: ターミナルからの直接実行
- 遷移先: インストール完了後、新しいzshセッションを起動

**権限による表示制御**：sudoが利用可能な場合、chshでsudoを使用してシェルを変更します。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 75 | install.sh | 主機能 | Oh My Zshをインストールする |
| 76 | setup_ohmyzsh | 補助機能 | OMZリポジトリをgit cloneで$ZSHにクローン |
| 77 | setup_zshrc | 補助機能 | テンプレートから.zshrcを作成し、既存の.zshrcをバックアップ |
| 78 | setup_shell | 補助機能 | chshコマンドでデフォルトシェルをzshに変更 |

## 画面種別

シェルスクリプト（対話型インストーラー）

## URL/ルーティング

```bash
# curlを使用
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

# wgetを使用
sh -c "$(wget -qO- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

# fetchを使用
sh -c "$(fetch -o - https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

# ローカル実行
sh install.sh [--unattended] [--skip-chsh] [--keep-zshrc]
```

## 入出力項目

### 入力項目（環境変数）

| 項目名 | 型 | 必須 | デフォルト | 説明 |
|--------|-----|------|----------|------|
| ZDOTDIR | パス | 任意 | 未設定 | zsh設定ファイルのディレクトリ |
| ZSH | パス | 任意 | $HOME/.oh-my-zsh | Oh My Zshのインストール先 |
| REPO | 文字列 | 任意 | ohmyzsh/ohmyzsh | GitHubリポジトリ名 |
| REMOTE | URL | 任意 | https://github.com/${REPO}.git | リポジトリURL |
| BRANCH | 文字列 | 任意 | master | チェックアウトするブランチ |
| CHSH | yes/no | 任意 | yes | デフォルトシェルを変更するか |
| RUNZSH | yes/no | 任意 | yes | インストール後にzshを起動するか |
| KEEP_ZSHRC | yes/no | 任意 | no | 既存の.zshrcを保持するか |
| OVERWRITE_CONFIRMATION | yes/no | 任意 | yes | 上書き確認を表示するか |

### 入力項目（コマンドライン引数）

| 引数 | 説明 |
|------|------|
| --unattended | RUNZSH=no, CHSH=no, OVERWRITE_CONFIRMATION=noを設定 |
| --skip-chsh | CHSH=noを設定 |
| --keep-zshrc | KEEP_ZSHRC=yesを設定 |

### 出力項目

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 進捗メッセージ | テキスト | 各処理ステップの状況 |
| 成功バナー | ASCII Art | Oh My Zshのレインボーロゴ |
| 案内メッセージ | テキスト | .zshrcの確認やSNSリンク |

## 表示項目

| 表示項目 | 表示条件 | 説明 |
|----------|----------|------|
| "Cloning Oh My Zsh..." | 常時 | クローン開始メッセージ |
| "Looking for an existing zsh config..." | 常時 | 設定ファイル検索メッセージ |
| "Found ~/.zshrc..." | 既存ファイルあり | 既存設定発見メッセージ |
| "Backing up to ~/.zshrc.pre-oh-my-zsh" | バックアップ時 | バックアップ通知 |
| "Using the Oh My Zsh template file..." | 常時 | テンプレート使用通知 |
| "Time to change your default shell to zsh:" | CHSH=yes時 | シェル変更案内 |
| 確認プロンプト | 対話時 | .zshrc上書き、シェル変更の確認 |
| Oh My Zshバナー | 成功時 | レインボーASCIIアート |
| SNS案内 | 成功時 | X、Discord、ショップへのリンク |

## イベント仕様

### 1-環境設定と引数解析

スクリプト開始時に環境を設定します。

- set -e でエラー時に即座に終了
- USER、HOME変数のフォールバック設定
- ZDOTDIR対応（zsh設定ディレクトリのカスタマイズ）
- コマンドライン引数の解析

### 2-前提条件確認

インストール可能かどうかを確認します。

- zshがインストールされているか確認
- $ZSHディレクトリが存在しないか確認
- ZDOTDIRディレクトリの作成（必要な場合）

### 3-setup_ohmyzsh

Oh My Zshリポジトリをクローンします。

- gitコマンドの存在確認
- umask設定（g-w,o-w）でセキュアなパーミッション
- git init → git config → git remote add → git fetch → git checkout の手順
- Windows/MSYSGitのチェック（Cygwin環境）
- クローン失敗時はディレクトリを削除して終了

### 4-setup_zshrc

.zshrcファイルを設定します。

- 既存の.zshrcの検出
- KEEP_ZSHRC=yesの場合はスキップ
- 上書き確認プロンプト（OVERWRITE_CONFIRMATION=yes時）
- 既存ファイルを.zshrc.pre-oh-my-zshにバックアップ
- テンプレートから新しい.zshrcを作成
- $ZSHパスを適切な形式（$HOME/または$ZDOTDIR/）に置換

### 5-setup_shell

デフォルトシェルをzshに変更します。

- CHSH=noの場合はスキップ
- 既にzshがデフォルトの場合はスキップ
- chshコマンドの存在確認
- シェル変更の確認プロンプト
- /etc/shellsからzshパスを取得
- 現在のシェルを.shell.pre-oh-my-zshにバックアップ
- sudo対応（user_can_sudo関数）

### 6-print_success

成功メッセージを表示します。

- レインボーカラーのASCIIアートバナー
- .zshrcの確認案内
- X（Twitter）、Discord、ショップへのリンク

### 7-zsh起動

新しいzshセッションを起動します。

- RUNZSH=noの場合はスキップして案内メッセージを表示
- exec zsh -l でログインシェルとして起動

## データベース更新仕様

本スクリプトはデータベースを使用しません。

### 操作別ファイルシステム影響一覧

| 操作 | 対象 | 操作種別 | 概要 |
|------|------|---------|------|
| git clone | $ZSH | CREATE | Oh My Zshリポジトリを作成 |
| .zshrcバックアップ | ~/.zshrc.pre-oh-my-zsh | CREATE | 既存設定のバックアップ |
| .zshrc作成 | ~/.zshrc | CREATE/UPDATE | Oh My Zsh用の設定ファイル |
| シェルバックアップ | ~/.shell.pre-oh-my-zsh | CREATE | 元のシェル設定を保存 |
| ZDOTDIR作成 | $ZDOTDIR | CREATE | 設定ディレクトリの作成 |

## メッセージ仕様

| 種別 | メッセージ | 表示条件 |
|------|----------|----------|
| 情報 | "Cloning Oh My Zsh..." | クローン開始時 |
| エラー | "git is not installed" | gitなし時 |
| エラー | "Windows/MSYS Git is not supported on Cygwin" | Cygwin+MSYSGit時 |
| エラー | "git clone of oh-my-zsh repo failed" | クローン失敗時 |
| 情報 | "Looking for an existing zsh config..." | 設定検索時 |
| 警告 | "Found ~/.zshrc." | 既存設定あり時 |
| 情報 | "Keeping..." | KEEP_ZSHRC=yes時 |
| プロンプト | "Do you want to overwrite it with the Oh My Zsh template? [Y/n]" | 上書き確認時 |
| 情報 | "Backing up to ~/.zshrc.pre-oh-my-zsh" | バックアップ時 |
| 情報 | "Using the Oh My Zsh template file..." | テンプレート使用時 |
| 情報 | "Time to change your default shell to zsh:" | シェル変更案内時 |
| プロンプト | "Do you want to change your default shell to zsh? [Y/n]" | シェル変更確認時 |
| 情報 | "Shell successfully changed to 'zsh'." | シェル変更成功時 |
| エラー | "chsh command unsuccessful" | chsh失敗時 |
| 情報 | "....is now installed!" | インストール完了時 |
| 情報 | "Run zsh to try it out." | RUNZSH=no時 |

## 例外処理

| 例外状態 | 処理内容 |
|----------|----------|
| zsh未インストール | エラーメッセージを表示して終了 |
| $ZSHディレクトリ存在 | 案内メッセージを表示して終了 |
| gitなし | エラーメッセージを表示して終了 |
| git clone失敗 | ディレクトリを削除してエラー終了 |
| .zshrcバックアップ競合 | エラーメッセージを表示して終了 |
| chsh失敗 | 手動変更の案内を表示（処理は継続） |
| 非TTY環境 | 自動的にunattendedモードで実行 |

## 備考

- POSIX準拠のshスクリプトとして記述されています（bashではなく）
- ハイパーリンクサポート検出機能があります（対応ターミナルでURLをクリック可能）
- TrueColor/256colorのサポート検出があります
- Termux環境への特別対応があります
- 非TTY環境（パイプ経由など）では自動的にunattendedモードになります

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

まず、インストールスクリプトで使用される環境変数とデフォルト値を理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | install.sh | `tools/install.sh` 行44-81 | 環境変数のデフォルト設定 |

**読解のコツ**: POSIXシェルの変数展開（${VAR:-default}）を理解してください。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | install.sh | `tools/install.sh` 行512-578 | main関数がエントリーポイント |

**主要処理フロー**:
- **行514-518**: 非TTY時のunattendedモード設定
- **行521-528**: 引数解析
- **行530**: 色設定初期化
- **行532-557**: 前提条件確認と$ZSH存在チェック
- **行559-566**: setup_ohmyzsh、setup_zshrc、setup_shell呼び出し
- **行568**: 成功メッセージ表示
- **行570-576**: zsh起動

#### Step 3: 各setup関数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | install.sh | `tools/install.sh` 行285-330 | setup_ohmyzsh関数 |
| 3-2 | install.sh | `tools/install.sh` 行332-394 | setup_zshrc関数 |
| 3-3 | install.sh | `tools/install.sh` 行396-490 | setup_shell関数 |

**setup_ohmyzshの処理フロー**:
- **行291**: umask設定
- **行293**: クローン開始メッセージ
- **行295-298**: git存在確認
- **行300-305**: Cygwin + MSYSGitチェック
- **行308-325**: git init → config → fetch → checkout

**setup_zshrcの処理フロー**:
- **行336**: クローン開始メッセージ
- **行340-378**: 既存.zshrc処理（バックアップ、確認プロンプト）
- **行381-392**: テンプレートからの生成

**setup_shellの処理フロー**:
- **行397-405**: スキップ条件チェック
- **行407-414**: chsh存在確認
- **行418-426**: 変更確認プロンプト
- **行428-455**: zshパス取得
- **行457-462**: 現在シェルのバックアップ
- **行466-487**: chsh実行

#### Step 4: ユーティリティ関数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | install.sh | `tools/install.sh` 行84-86 | command_exists関数 |
| 4-2 | install.sh | `tools/install.sh` 行88-114 | user_can_sudo関数 |
| 4-3 | install.sh | `tools/install.sh` 行148-196 | supports_hyperlinks関数 |
| 4-4 | install.sh | `tools/install.sh` 行242-283 | setup_color関数 |

### プログラム呼び出し階層図

```
sh install.sh [args]
    │
    └─ main [tools/install.sh:512-578]
           │
           ├─ setup_color [tools/install.sh:242-283]
           │      └─ supports_truecolor
           │
           ├─ command_exists zsh (確認)
           │
           ├─ setup_ohmyzsh [tools/install.sh:285-330]
           │      ├─ command_exists git
           │      ├─ git init
           │      ├─ git config (複数)
           │      ├─ git remote add
           │      ├─ git fetch
           │      └─ git checkout
           │
           ├─ setup_zshrc [tools/install.sh:332-394]
           │      ├─ 既存.zshrcのバックアップ
           │      └─ sed (テンプレート処理)
           │
           ├─ setup_shell [tools/install.sh:396-490]
           │      ├─ command_exists chsh
           │      ├─ user_can_sudo
           │      └─ chsh -s zsh
           │
           ├─ print_success [tools/install.sh:492-510]
           │      └─ fmt_link (ハイパーリンク)
           │
           └─ exec zsh -l
```

### データフロー図

```
[入力]                    [処理]                           [出力]

環境変数 ─────────────▶ main()
引数                        │
                           ▼
                     setup_color ──────────────────────▶ 色変数設定
                           │
                           ▼
                     setup_ohmyzsh ────────────────────▶ $ZSH/ディレクトリ
                           │                              (gitリポジトリ)
                           ▼
                     setup_zshrc ──────────────────────▶ ~/.zshrc
                           │                              ~/.zshrc.pre-oh-my-zsh
                           ▼
                     setup_shell ──────────────────────▶ /etc/passwd更新
                           │                              ~/.shell.pre-oh-my-zsh
                           ▼
                     print_success ────────────────────▶ バナー表示
                           │
                           ▼
                     exec zsh ─────────────────────────▶ 新しいzshセッション
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| install.sh | `tools/install.sh` | ソース | メインインストールスクリプト |
| zshrc.zsh-template | `templates/zshrc.zsh-template` | テンプレート | .zshrcのテンプレート |
| minimal.zshrc | `templates/minimal.zshrc` | テンプレート | 最小.zshrc設定の参考 |
| .zshrc | `~/.zshrc` | 設定 | 生成される設定ファイル |
| .zshrc.pre-oh-my-zsh | `~/.zshrc.pre-oh-my-zsh` | バックアップ | 既存設定のバックアップ |
| .shell.pre-oh-my-zsh | `~/.shell.pre-oh-my-zsh` | バックアップ | 元シェル設定のバックアップ |
