シェル環境の構築(zsh / Oh My Zsh / starship / nvm)
開発の入口となるシェル環境を、起動速度と保守性を意識して構築するための要素技術です。
zsh と bash
zsh は bash の上位互換に近い高機能シェルで、補完やテーマ・プラグインのエコシステムが充実しています。Ubuntu などのデフォルトは bash のことが多いため、ログインシェルを zsh に切り替えて使うのが一般的です。
| 項目 | bash | zsh |
|---|---|---|
| 互換性 | POSIX 準拠・デフォルト採用が多い | bash の多くをカバー、拡張が豊富 |
| 補完 | 部分的 | メニュー補完・豊富な補完関数 |
| プラグイン | 少なめ | Oh My Zsh などで充実 |
bash も完全に捨てるのではなく、非対話シェルやスクリプトの互換性のため .bashrc も併せて管理することがあります。
Oh My Zsh とプラグイン
Oh My Zsh は zsh の設定・プラグイン・テーマを管理するフレームワークです。~/.oh-my-zsh にインストールされ、.zshrc の plugins=(...) で有効化するプラグインを宣言します。
# .zshrc
export ZSH="$HOME/.oh-my-zsh"
ZSH_THEME=""
plugins=(git zsh-autosuggestions zsh-completions zsh-syntax-highlighting)
source "$ZSH/oh-my-zsh.sh"
よく使われる外部プラグインは以下の通りです。
| プラグイン | 役割 |
|---|---|
| zsh-autosuggestions | 履歴に基づく入力サジェスト |
| zsh-syntax-highlighting | コマンドの構文を色分け |
| zsh-completions | 追加の補完定義 |
これらは Oh My Zsh 本体に含まれないため、~/.oh-my-zsh/custom/plugins/ に clone して導入します(導入スクリプト側で冪等に clone するのが定石です)。
プロンプト: starship
starship は Rust 製のクロスシェル対応プロンプトで、bash / zsh / fish などで同じ設定を使えます。設定は ~/.config/starship.toml に置きます。
# .zshrc での有効化
if command -v starship >/dev/null 2>&1; then
eval "$(starship init zsh)"
fi
command -v で存在確認してから初期化するのは、ツール未導入環境でも .zshrc が壊れないための防御です。Powerlevel10k など zsh 専用の代替もありますが、クロスシェル・設定ファイル一本化という点で starship は扱いやすい選択肢です。
Node.js のバージョン管理: nvm と遅延読み込み
nvm(Node Version Manager)は、Node.js をユーザー単位・複数バージョンで管理するツールです。課題は nvm.sh の読み込みがシェル起動を遅くすること。そこで「遅延読み込み(lazy loading)」というテクニックを使います。
考え方は「既定バージョンの bin だけを PATH に足し、nvm コマンドを初回実行時にだけ本体を読み込む」です。
# .zshrc (nvm の遅延読み込み)
export NVM_DIR="$HOME/.nvm"
# 既定 Node の bin を PATH に直接追加 (node/npm/npx を即時利用可能に)
if [ -r "$NVM_DIR/alias/default" ]; then
_nvm_default="$(<"$NVM_DIR/alias/default")"
_nvm_bin="$NVM_DIR/versions/node/v${_nvm_default}/bin"
[ -d "$_nvm_bin" ] && export PATH="$_nvm_bin:$PATH"
unset _nvm_default _nvm_bin
fi
# nvm コマンドは初回呼び出し時に本体を読み込む
nvm() {
unset -f nvm
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
nvm "$@"
}
nvm alias default <version> で既定バージョンを設定しておくと、.zshrc は alias/default を解決するだけで済みます。Node をバージョンアップしても dotfile を修正する必要がないのが利点です。
bash 側では関数による遅延読み込みが難しいため、素直に nvm.sh を読み込むことが多いです。
PATH の管理
ユーザー固有のツールを置くディレクトリを、dotfile 内で明示的に PATH へ追加します。
export PATH="$HOME/.local/bin:$PATH"
export PATH="$HOME/.opencode/bin:$PATH"
複数 dotfile にまたがって同じ PATH を書くと冗長になるため、共通部分は .profile などに集約する構成もあります。
マシン固有設定の分離
機密情報やマシン固有の値は、本体 dotfile の末尾で .local ファイルを読み込んで分離します。
# .zshrc の末尾
[ -f "$HOME/.zshrc.local" ] && source "$HOME/.zshrc.local"
詳細は chezmoi による dotfiles 管理 を参照してください。