Fish Shell (fish) の特徴と使い方完全ガイド — 対話型シェルの補完・構文ハイライト・設定・プラグイン管理を徹底解説

概要 — fish とは何か

fish(friendly interactive shell)は、対話的シェルとして使いやすさを重視して開発された Unix シェルです。既存の Bourne 系シェル(bash や zsh)と比べて、デフォルトで使える機能(色付き構文強調、コマンド履歴に基づく自動補完、候補のインライン表示など)を備え、設定やカスタマイズが比較的容易である点を特徴とします。プロジェクトはオープンソースで、公式サイトや GitHub リポジトリでドキュメントやソースコードが公開されています。

主な特徴(インタラクティブ面)

  • 入力補完と自動候補 — コマンド履歴やマニュアル情報、インストール済みコマンドを基にした強力な補完を提供。入力中に履歴からの候補を薄いグレーで表示する「autosuggestions」機能が標準で有効。
  • 構文強調(syntax highlighting) — 無効なコマンドや存在しないファイル名を色で示すため、タイプミスを即座に検出しやすい。
  • 簡易なカスタマイズ — fish_config コマンドでローカルに Web UI を起動し、プロンプトやテーマ、補完をブラウザで編集できる。
  • プロンプトの関数化 — prompt は関数(fish_prompt / fish_right_prompt)で定義され、簡単にカスタマイズ・共有できる。
  • 略語(abbreviations)とユニバーサル変数 — よく使うコマンドを略語として登録でき、ユニバーサル変数は複数のセッション間で永続化される。

設定ファイルとディレクトリ構成

主要な設定場所は XDG 準拠で以下が使われます(ユーザープロファイル):

  • ~/.config/fish/config.fish — シェル起動時に読み込まれるメイン設定ファイル
  • ~/.config/fish/functions/ — 個別の関数ファイル(fish_prompt など)
  • ~/.config/fish/completions/ — コマンド固有の補完定義
  • ~/.config/fish/fish_variables — ユニバーサル変数の保存先(バイナリ形式)

基本的な文法とスクリプト例

fish は POSIX シェル互換を目指していないため、bash/zsh の構文とは異なります。対話シェル用途に最適化された直感的なコマンドが多いのが特徴です。

代表的な例:

# 変数の設定(配列も簡単)
set foo bar baz
set -l index 0

# 関数定義(引数は $argv、戻り値は exit コード)
function ll
    ls -la $argv
end

# for ループ
for i in (seq 1 5)
    echo $i
end

# if 条件
if test -f /etc/os-release
    echo "Linux"
end

スクリプトとして実行する場合は shebang を明示する: #!/usr/bin/env fish。ただし、多くのシステムスクリプトは POSIX 互換を前提としているため、システム用スクリプトには /bin/sh や bash を使うことが推奨されます。

補完と拡張(complete と補完ファイル)

補完は組み込みの complete コマンドで定義します。多くのパッケージは補完ファイルを提供しており、/usr/share/fish/completions やユーザーの ~/.config/fish/completions に配置して読み込ませます。補完の恩恵により、CLI ツールの習熟速度が上がります。

プラグイン管理とテーマ

  • Fisher(https://github.com/jorgebucaran/fisher) — 現在広く使われているプラグインマネージャ。軽量でインストールも簡単。
  • Oh My Fish (OMF) — かつて人気のフレームワーク。現在でもテーマやプラグインのエコシステムが存在する。

各種テーマや prompt はプラグインとして配布されており、fisher などでインストールしてすぐ使えます。

互換性と注意点

  • POSIX 非準拠 — fish スクリプトは POSIX 準拠ではないため、既存の bash シェルスクリプトをそのまま動かすことはできません。システムの init スクリプトやパッケージ付属のスクリプトは /bin/sh や bash を想定しているので注意。
  • 環境変数の設定 — export 相当は set -x VAR value。ログイン時に PATH を変更する際は config.fish に記述するか、プロファイルの扱いに注意。
  • 非対話的利用 — バッチ処理や CI で使う場合は shebang を付ければ実行可能だが、移植性の観点からは POSIX シェルの使用が無難。

運用面でのポイント

  • チーム導入の是非 — 開発者個人の生産性を上げるには有効だが、社内スクリプトがfishに依存することは避け、運用系スクリプトは POSIX 準拠に保つのが賢明。
  • 設定の共有 — functions や config.fish を dotfiles として Git 管理し、fisherfile などでプラグインセットを明示すると再現性が高まる。
  • セキュリティ — fish_config はローカルで Web UI を立てる機能を持つが、既定ではローカルのみで公開する。リモートで公開しないこと(無闇な公開は危険)。

導入手順(簡易ガイド)

  • インストール(例): apt / yum / brew / pacman など各ディストリビューションのパッケージマネージャ経由でインストール可能。ソースや公式バイナリからもインストールできる。
  • 初期設定: fish_config を使ってテーマや補完を設定。必要な関数や補完を ~/.config/fish/ 配下に置く。
  • プラグイン: fisher を導入してプラグインやテーマを管理。
  • デフォルトシェル化: chsh -s /usr/bin/fish などでログインシェルを fish に変更(OS によりパスは異なる)。

いつ使うべきか・使うべきでないか

  • 推奨: 日常的な対話シェルとしての利用。対話的にコマンドライン効率を上げたい開発者に向く。
  • 非推奨: システムレベルで配布・実行されるスクリプト群の標準シェル化。CI スクリプトやインストールスクリプトは POSIX 準拠シェルを使うべき。

まとめ

fish は「使いやすさ」を第一に設計された対話型シェルであり、デフォルト機能だけでも日常のシェル利用を大きく改善します。ただし POSIX 非互換である点は設計上のトレードオフであり、運用・自動化用スクリプトには向かないことに注意が必要です。個人の開発環境や対話的ワークフローを効率化したい場合には強く推奨できる選択肢です。

参考文献