---
# System prepended metadata

title: 在 Ubuntu 中，我選擇用 zsh 而不是原生 shell
tags: [Ubuntu22.04]

---

# 在 Ubuntu 中，我選擇用 zsh 而不是原生 shell

## 1 它有什麼好處?

原生的 shell 是 bash 但我認為它有太多的限制，重點是看起來有夠土，選擇使用 zsh 對眼睛更為友善，並且還有以下的優點：

- **互動效率高**：補全更聰明、支援萬用字元、通配更強、歷史搜尋方便。
- **可擴充**：oh-my-zsh / powerlevel10k / 各式 plugin（git、z、fzf…）一鍵上手。
- **長期維護友善**：把常用 alias / PATH / 環境變數集中在 `~/.zshrc`，讓操作能夠跨專案一致。

## 2 要怎麼安裝與使用?

### 2.1 安裝 zsh

```bash
sudo apt update
sudo apt install -y zsh
```

- 第1行：更新套件索引，確保拿到最新的套件版本資訊。
- 第2行：安裝 zsh；`-y` 自動回答「Yes」，避免中途卡住。


### 2.2 將 zsh 設為預設 shell

```bash
chsh -s "$(which zsh)"
```

- `chsh -s`: 變更預設登入 shell。
- `$(which zsh)`: 取得 zsh 的完整路徑（通常是 `/usr/bin/zsh`）。

> 執行後*登出並重新登入*，或重開終端，就會以 zsh 起跑。
> 檢查方式：`echo $SHELL` 應該會回傳 `.../zsh`。


### 2.3 安裝 Oh My Zsh

```bash
export RUNZSH=no
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
exec zsh -l
```

- 第1行：設定安裝完成*先不要自動啟動 zsh*（避免覆蓋）。
- 第2行：以 `sh -c` 執行官方安裝腳本；`curl -fsSL` 代表失敗安靜、跟隨轉址、輸出到 stdout。
- 第3行：以 login shell 方式啟動 zsh，套用剛安裝的預設設定。

> 若你曾安裝過：腳本會提示資料夾已存在，不必重複安裝。要重置就先備份 `~/.zshrc` 與 `~/.oh-my-zsh`，再重新跑上面三行。


## 3 編輯 `.zshrc`（追加設定，不要覆蓋）

> **提醒**：不要整份覆蓋 `.zshrc`，因為裡面可能已經有重要設定（例如 ROS 或 Powerlevel10k）。
> 請先備份：
>
> ```bash
> cp ~/.zshrc ~/.zshrc.backup.$(date +%F-%H%M)
> ```

想要編輯 `.zshrc` 有兩種方法：

- **方法 1：用 nano（CLI 簡單）**

  ```bash
  nano ~/.zshrc
  ```

  存檔：Ctrl+O → Enter，離開：Ctrl+X。

- **方法 2：用 VS Code（GUI，直覺）**

  ```bash
  code ~/.zshrc
  ```

  前提：已安裝 VS Code，且 `code` 指令可用。


### 3.1 建議追加的設定（貼在 `source $ZSH/oh-my-zsh.sh` **下面**）

```bash
# === 路徑與常用環境 ===
export PATH="$HOME/.local/bin:$PATH"         # 讓 pip --user / 自行安裝的指令能被找到
export EDITOR="code --wait"                  # 預設編輯器：VS Code，--wait 讓命令列流程可控

# === 常用 alias（依你日常調整）===
alias ll='ls -alF'                           # 長列表＋明確型別
alias gs='git status'                        # Git 常用縮寫
alias gc='git commit'                        # Git 常用縮寫
alias gp='git push'                          # Git 常用縮寫
```

修改後記得重新載入：

```bash
source ~/.zshrc
```


## 4 安裝 fzf（模糊搜尋工具）

很多文章直接寫 `plugins=(git fzf)`，但要注意：**fzf 並不是 zsh 內建功能**，需要額外安裝。

```bash
sudo apt install -y fzf
```

安裝後，建議再補上 **快捷鍵綁定**（追加到 `.zshrc`，放在 oh-my-zsh 後面）：

```bash
# === fzf 鍵綁定（↑ 搜歷史、Ctrl+T 增強）===
if [ -f /usr/share/doc/fzf/examples/key-bindings.zsh ]; then
  source /usr/share/doc/fzf/examples/key-bindings.zsh
fi
```

檢查是否成功：

```bash
在鍵盤上直接輸入 Ctrl+T   # 應顯示 fzf-file-widget
```

---

## 5 讓你看 terminal 看爽爽 — Powerlevel10k 主題

> 想要圖示、git 狀態、執行時間都即時顯示，且極快：

```bash
# 安裝 MesloLGS NF 字型（P10k 推薦字型；換到終端機字型設定）
sudo apt install -y fonts-powerline

# 安裝 p10k
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git $ZSH/custom/themes/powerlevel10k

# 啟用主題（編輯 ~/.zshrc）
sed -i 's/^ZSH_THEME=.*/ZSH_THEME="powerlevel10k\/powerlevel10k"/' ~/.zshrc

# 套用設定嚮導
exec zsh -l
p10k configure
```

- 第1行：安裝字型，避免亂碼。
- 第2行：抓 p10k 主題到 oh-my-zsh custom 目錄。
- 第3行：把主題切到 p10k。
- 第4\~5行：重啟 zsh，跑嚮導，互動式選擇你喜歡的樣式。


## 6 使用方式（日常最有感的 5 招）

1. **Ctrl+R**：在歷史指令中用 fzf 互動式搜尋，回車即執行。
2. **Ctrl+T**：在目前資料夾快速挑檔案，回車貼到命令列（需 fzf 已安裝）。
3. **alias**：`ll`、`gs`、`gc`、`gp` 讓 git 操作更順。
4. **快速補全**：打 `git ch<Tab>` → 提示 `git checkout`。
5. **歷史容量＋搜尋**：做研究常常會反覆用長指令（colcon、docker、ros2），歷史越多越好找。


## 7 檢查與評估（如何「看得出來」有沒有設定好）

```bash
echo $SHELL                      # 應該顯示 /usr/bin/zsh
zsh --version                    # 應該 ≥ 5.8
time zsh -i -c exit              # 啟動耗時（目標 < 0.20s）
type ll gs                       # 檢查 alias 是否生效
bindkey '^T'                     # 確認 Ctrl+T 是否綁到 fzf
print -r -- $PATH | tr ':' '\n'  # 確認 ~/.local/bin 是否在 PATH 前段
```


## 8 疑難排解

- **`chsh -s` 沒效**：請**登出並重新登入**，或用 `echo $SHELL` 驗證；必要時 `sudo usermod -s /usr/bin/zsh "$USER"` 後再 relogin。
- **亂碼/方塊字**：終端機字型改成 **MesloLGS NF** 或其他 Nerd Font；或 `sudo apt install fonts-powerline`。
- **啟動很慢**：關閉不必要插件或回到簡單主題；用 `zsh -x` 追慢點。
- **fzf 快捷鍵無效**：確認 `fzf` 已安裝，並且 `.zshrc` 有正確載入 `key-bindings.zsh`。



## 9 移除 / 回退（知道怎麼撤銷才放心）

```bash
# 回到 bash
chsh -s /bin/bash
# 刪除 oh-my-zsh（先備份 .zshrc）
cp ~/.zshrc ~/.zshrc.bak.$(date +%F-%H%M)
rm -rf ~/.oh-my-zsh
# 想連 zsh 一起移除（通常不需要）
sudo apt purge -y zsh
```
---
希望我的內容對你有所幫助，想看到更多內容歡迎追蹤我的 IG、Threads 等平台。
Threads：[@minimalist_shine](https://www.threads.com/@minimalist_shine)
IG：[@minimalist_shine](https://www.instagram.com/minimalist_shine/)
