メインコンテンツまでスキップ

シェル環境の構築(zsh / Oh My Zsh / starship / nvm)

開発の入口となるシェル環境を、起動速度と保守性を意識して構築するための要素技術です。

zsh と bash​

zsh は bash の上位互換に近い高機能シェルで、補完やテーマ・プラグインのエコシステムが充実しています。Ubuntu などのデフォルトは bash のことが多いため、ログインシェルを zsh に切り替えて使うのが一般的です。

項目bashzsh
互換性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 管理 を参照してください。

参考リンク​