応用編:パフォーマンスとベストプラクティス
起動速度のプロファイリングと高速化、設定ファイルの管理とリカバリー、および保守性の高い fish スクリプトを作成するためのコーディング規約を解説します。
起動速度のプロファイリングと最適化
fish の起動が重く感じられる場合、組み込みのプロファイリング機能を用いてどの処理に時間がかかっているかを正確に計測できます。
# 起動プロファイルを startup.log に記録して終了
fish --profile-startup startup.log -i -c exit
# 実行時間順にソートしてボトルネックを調査
sort -nk2 startup.log | tail -n 20
» 起動時間を短縮するための改善ポイント
- 外部コマンド呼び出しの削減:
config.fishのトップレベルでgrepやawk、nodeなどの外部コマンドを何度も呼び出すと、プロセスの生成コストで起動が数百ミリ秒遅延します。 - オートロード(functions/)の徹底:
関数は
config.fishに直接長く書くのではなく、~/.config/fish/functions/配下の個別ファイルに分割し、実際に呼び出されるまで読み込まない設計にします。 - 重いツールの遅延初期化: 頻繁に使わない CLI ツールの初期化コードは、専用の関数内で呼び出された初回にのみ初期化するラッパー関数にするなどの工夫が有効です。
設定ファイルの構成とリカバリー
fish の設定ファイルはすべて標準的な XDG ディレクトリ(~/.config/fish/)配下に集約されています。
~/.config/fish/
├── config.fish # ユーザー設定エントリーポイント
├── fish_plugins # Fisher で管理されているプラグイン一覧
├── fish_variables # ユニバーサル変数(set -U)の実体データ
├── functions/ # オートロードされる自作関数群
└── completions/ # オートロードされるカスタム補完スクリプト
» 不具合時のクリーン起動(–no-config)
プラグインの不整合や構文エラーによって fish が起動しなくなった場合は、設定ファイルの読み込みを完全にスキップして素の状態で起動できます。
fish --no-config
また、設定したユニバーサル変数をすべて初期化したい場合は、~/.config/fish/fish_variables をバックアップした上で削除してシェルを再起動します。
スクリプト作成のベストプラクティス
共同開発や個人運用でトラブルを起こさないための規約です。
» 1. コマンドの存在確認には type -q を使用する
外部ツールがインストールされているか判定する際は、出力を抑制する -q(quiet)オプションを指定した type コマンドを使用します。
if not type -q git
echo "Error: git is not installed."
return 1
end
» 2. 変数宣言時のスコープ明示
関数内やブロック内で変数を定義する際は、スコープフラグ(-l または -g)の省略を避け、必ず明示します。
# 良い例: ローカル変数を明示
set -l current_user (whoami)
# 避けるべき例: スコープが曖昧
set current_user (whoami)
» 3. 関数には必ず説明文(–description)をつける
関数を定義する際は、--description 引数で役割を明記します。これにより、functions my_func で概要を確認でき、タブ補完時にも説明文が自動表示されます。
function clean_logs --description "古いログファイルを削除して空き容量を確保する"
rm -rf ./logs/*.log
end