# 画面設計書 18-uninstall.sh

## 概要

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

### 本画面の処理概要

`uninstall.sh` は、Oh My Zshをシステムから削除し、元の設定に復元するためのシェルスクリプトです。

**業務上の目的・背景**：ユーザーがOh My Zshを使用しなくなった場合や、問題が発生して再インストールが必要な場合に、クリーンな状態に戻すことが重要です。本スクリプトは、Oh My Zshの削除、元の.zshrc設定の復元、デフォルトシェルの復元を行い、Oh My Zshインストール前の状態に可能な限り近づけます。

**画面へのアクセス方法**：ターミナルで `~/.oh-my-zsh/tools/uninstall.sh` を実行、または `source ~/.oh-my-zsh/tools/uninstall.sh` を実行します。

**主要な操作・処理内容**：
1. デフォルトシェルを元に戻す（.shell.pre-oh-my-zshが存在する場合）
2. アンインストール確認プロンプトを表示
3. ~/.oh-my-zshディレクトリを削除
4. 現在の.zshrcをバックアップ（.zshrc.omz-uninstalled-<日時>）
5. 元の.zshrc（.zshrc.pre-oh-my-zsh）を復元

**画面遷移**：
- 遷移元: ターミナルからの直接実行
- 遷移先: なし（処理完了後、ターミナル再起動を案内）

**権限による表示制御**：chshが利用可能な場合のみシェル復元を試みます。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 83 | uninstall.sh | 主機能 | OMZをアンインストールする（ディレクトリ削除、.zshrc復元、シェル復元） |

## 画面種別

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

## URL/ルーティング

```bash
# 直接実行
~/.oh-my-zsh/tools/uninstall.sh

# sourceで実行
source ~/.oh-my-zsh/tools/uninstall.sh

# フルパス
sh $ZSH/tools/uninstall.sh
```

## 入出力項目

### 入力項目

| 項目名 | 型 | 必須 | 説明 |
|--------|-----|------|------|
| 確認応答 | 文字 | 必須 | y/Yでアンインストール実行、それ以外でキャンセル |

### 出力項目

| 項目名 | 型 | 説明 |
|--------|-----|------|
| シェル復元メッセージ | テキスト | デフォルトシェルの復元状況 |
| 確認プロンプト | テキスト | アンインストール確認 |
| 削除メッセージ | テキスト | 各処理ステップの状況 |
| 完了メッセージ | テキスト | アンインストール完了通知 |

## 表示項目

| 表示項目 | 表示条件 | 説明 |
|----------|----------|------|
| "Switching your shell back to '...'" | シェル復元時 | 元のシェルへの復帰案内 |
| "Could not change default shell" | chsh失敗時 | 手動変更の案内 |
| 確認プロンプト | 常時 | "Are you sure you want to remove Oh My Zsh? [y/N]" |
| "Uninstall cancelled" | キャンセル時 | キャンセル通知 |
| "Removing ~/.oh-my-zsh" | 確認後 | ディレクトリ削除通知 |
| "Found ~/.zshrc -- Renaming to ..." | .zshrc存在時 | 現設定のバックアップ通知 |
| "Looking for original zsh config..." | 常時 | 元設定の検索通知 |
| "Found ... -- Restoring to ~/.zshrc" | 元設定あり | 設定復元通知 |
| "No original zsh config found" | 元設定なし | 元設定なし通知 |
| "Thanks for trying out Oh My Zsh..." | 常時 | 完了メッセージ |
| "Don't forget to restart your terminal!" | 常時 | ターミナル再起動の案内 |

## イベント仕様

### 1-シェル復元

デフォルトシェルを元に戻します。

- chshコマンドの存在確認
- ~/.shell.pre-oh-my-zshファイルの存在確認
- ファイルから元のシェルパスを読み込み
- chsh -s で元のシェルに復帰
- 成功時は.shell.pre-oh-my-zshを削除
- 失敗時は手動変更の案内を表示

### 2-アンインストール確認

ユーザーにアンインストール確認を求めます。

- "Are you sure you want to remove Oh My Zsh? [y/N]" プロンプト
- y または Y の場合のみ処理を続行
- それ以外は "Uninstall cancelled" を表示して終了

### 3-ディレクトリ削除

Oh My Zshディレクトリを削除します。

- ~/.oh-my-zsh の存在確認
- rm -rf で完全削除

### 4-.zshrcバックアップ

現在の.zshrcをバックアップします。

- ~/.zshrc の存在確認
- 存在する場合、.zshrc.omz-uninstalled-<日時> にリネーム
- 日時形式: %Y-%m-%d_%H-%M-%S

### 5-元設定の復元

元の.zshrc設定を復元します。

- ~/.zshrc.pre-oh-my-zsh の存在確認
- 存在する場合、~/.zshrc にリネーム
- 存在しない場合、その旨を通知

### 6-完了メッセージ

アンインストール完了を通知します。

- 感謝メッセージを表示
- ターミナル再起動の案内を表示

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

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

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

| 操作 | 対象 | 操作種別 | 概要 |
|------|------|---------|------|
| ディレクトリ削除 | ~/.oh-my-zsh | DELETE | Oh My Zshディレクトリを削除 |
| .zshrcバックアップ | ~/.zshrc.omz-uninstalled-* | RENAME | 現設定をバックアップ |
| 設定復元 | ~/.zshrc | RENAME | 元の.zshrcを復元 |
| シェル設定削除 | ~/.shell.pre-oh-my-zsh | DELETE | シェル復元後に削除 |

## メッセージ仕様

| 種別 | メッセージ | 表示条件 |
|------|----------|----------|
| 情報 | "Switching your shell back to '$old_shell':" | シェル復元時 |
| エラー | "Could not change default shell. Change it manually by running chsh or editing the /etc/passwd file." | chsh失敗時 |
| プロンプト | "Are you sure you want to remove Oh My Zsh? [y/N]" | 常時 |
| 情報 | "Uninstall cancelled" | キャンセル時 |
| 情報 | "Removing ~/.oh-my-zsh" | 削除実行時 |
| 情報 | "Found ~/.zshrc -- Renaming to ${ZSHRC_SAVE}" | .zshrcバックアップ時 |
| 情報 | "Looking for original zsh config..." | 元設定検索時 |
| 情報 | "Found $ZSHRC_ORIG -- Restoring to ~/.zshrc" | 元設定復元時 |
| 情報 | "Your original zsh config was restored." | 復元完了時 |
| 情報 | "No original zsh config found" | 元設定なし時 |
| 情報 | "Thanks for trying out Oh My Zsh. It's been uninstalled." | 完了時 |
| 情報 | "Don't forget to restart your terminal!" | 完了時 |

## 例外処理

| 例外状態 | 処理内容 |
|----------|----------|
| chshなし | シェル復元をスキップ |
| .shell.pre-oh-my-zshなし | シェル復元をスキップ |
| chsh失敗 | 手動変更の案内を表示（処理は継続しない） |
| アンインストールキャンセル | "Uninstall cancelled"を表示して終了 |
| ~/.oh-my-zshなし | 削除処理をスキップ |
| .zshrc.pre-oh-my-zshなし | 復元なしの旨を通知 |

## 備考

- シェル復元が失敗した場合、スクリプトは終了します（残りの処理は実行されません）
- 確認プロンプトはデフォルトが "N" のため、Enterだけではアンインストールされません
- 元の.zshrcが存在しない場合でも、現在の.zshrcはバックアップされます
- 削除前に必ず確認があるため、誤操作による削除を防げます

---

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

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

### 推奨読解順序

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

まず、アンインストールスクリプトで使用される主要なファイルパスを理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | uninstall.sh | `tools/uninstall.sh` | 使用されるファイルパス変数（old_shell, ZSHRC_SAVE, ZSHRC_ORIG） |

**読解のコツ**: シンプルなスクリプトなので、上から順に読むことができます。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | uninstall.sh | `tools/uninstall.sh` 行1-42 | スクリプト全体（main関数なし） |

**主要処理フロー**:
- **行1-11**: シェル復元処理
- **行13-17**: アンインストール確認
- **行19-22**: ディレクトリ削除
- **行24-28**: .zshrcバックアップ
- **行30-38**: 元設定の復元
- **行40-41**: 完了メッセージ

#### Step 3: 各処理ブロックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | uninstall.sh | `tools/uninstall.sh` 行1-11 | シェル復元ブロック |

**シェル復元の処理フロー**:
- **行1**: hash chsh と .shell.pre-oh-my-zsh存在確認
- **行2**: 元のシェルパスを読み込み
- **行3**: 復元メッセージ表示
- **行4-6**: chsh実行、成功時はバックアップ削除
- **行7-10**: 失敗時のエラーメッセージ

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-2 | uninstall.sh | `tools/uninstall.sh` 行13-17 | 確認プロンプトブロック |

**確認プロンプトの処理フロー**:
- **行13**: read -r -p で確認入力を取得
- **行14-17**: y/Y以外はキャンセル

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-3 | uninstall.sh | `tools/uninstall.sh` 行19-22 | ディレクトリ削除ブロック |

**ディレクトリ削除の処理フロー**:
- **行19**: 削除メッセージ
- **行20-22**: 存在確認とrm -rf

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-4 | uninstall.sh | `tools/uninstall.sh` 行24-38 | 設定ファイル処理ブロック |

**.zshrc処理の処理フロー**:
- **行24-28**: 現在の.zshrcをバックアップ
- **行30-38**: 元の.zshrcを復元

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

```
sh uninstall.sh
    │
    ├─ シェル復元 [tools/uninstall.sh:1-11]
    │      ├─ hash chsh (存在確認)
    │      ├─ cat ~/.shell.pre-oh-my-zsh
    │      ├─ chsh -s "$old_shell"
    │      └─ rm -f ~/.shell.pre-oh-my-zsh
    │
    ├─ 確認プロンプト [tools/uninstall.sh:13-17]
    │      └─ read -r -p
    │
    ├─ ディレクトリ削除 [tools/uninstall.sh:19-22]
    │      └─ rm -rf ~/.oh-my-zsh
    │
    ├─ .zshrcバックアップ [tools/uninstall.sh:24-28]
    │      └─ mv ~/.zshrc ~/.zshrc.omz-uninstalled-*
    │
    ├─ 元設定復元 [tools/uninstall.sh:30-38]
    │      └─ mv ~/.zshrc.pre-oh-my-zsh ~/.zshrc
    │
    └─ 完了メッセージ [tools/uninstall.sh:40-41]
           └─ echo
```

### データフロー図

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

(なし) ─────────▶ シェル復元
                        │
                        ▼
                  確認プロンプト ─────────────────────▶ "Are you sure?"
                        │
ユーザー入力 ───────────│
                        │
                        ▼ (y/Y)
                  rm -rf ~/.oh-my-zsh ─────────────────▶ ディレクトリ削除
                        │
                        ▼
                  mv ~/.zshrc ─────────────────────────▶ .zshrc.omz-uninstalled-*
                        │
                        ▼
                  mv ~/.zshrc.pre-oh-my-zsh ───────────▶ ~/.zshrc (復元)
                        │
                        ▼
                  echo ────────────────────────────────▶ 完了メッセージ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| uninstall.sh | `tools/uninstall.sh` | ソース | メインアンインストールスクリプト |
| .shell.pre-oh-my-zsh | `~/.shell.pre-oh-my-zsh` | バックアップ | 元シェル設定のバックアップ |
| .zshrc.pre-oh-my-zsh | `~/.zshrc.pre-oh-my-zsh` | バックアップ | 元.zshrcのバックアップ |
| .zshrc.omz-uninstalled-* | `~/.zshrc.omz-uninstalled-*` | バックアップ | アンインストール時の.zshrcバックアップ |
| .oh-my-zsh | `~/.oh-my-zsh` | ディレクトリ | 削除対象のOh My Zshディレクトリ |
