📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

概要

Fishは、LinuxやMacOS向けのスマートで使用しやすいコマンドラインシェルである。

Fishには、以下に示す特徴がある。

  • オートサジェスト
    Webブラウザのように履歴や補完に基づいて、入力中にコマンドを提案する。

  • 美しいVGAカラー
    24ビットのTrueColorをサポートしている。

  • 完全なスクリプト言語
    Fishは完全にスクリプト化されており、その構文はシンプル、クリーン、かつ一貫している。

  • Webベースの設定
    Webページから色を設定することや、関数、変数、履歴を表示することができる。

  • Man Page Completions
    他のシェルはプログラム可能な補完機能をサポートしているが、Fishでは、インストールされたmanページを解析して自動的に補完機能を生成する。

  • アウトオブザボックス機能
    タブ補完やシンタックスハイライト等の機能が動作するだけでなく、新たに設定する必要がない。



Fishのインストール

パッケージ管理システムからインストール

パッケージ管理システムからFishをインストールする。

# RHEL
sudo dnf install fish

# SUSE
sudo zypper install fish


ソースコードからインストール

ビルドに必要な依存関係のライブラリをインストールする。

# RHEL
sudo dnf install cmake ncurses-devel

# SUSE
sudo zypper install cmake ncurses-devel ncurses5-devel libpcre2-32-0 libpcre2-16-0 libpcre2-8-0 pcre2-devel \
                    python3-Sphinx gettext-runtime gettext-tools
                    rust cargo  # Fish 4.0以降からRustが必須

# Manjaro
sudo pacman -S --needed cmake ncurses pcre2 python-sphinx gettext
                        rust  # Fish 4.0以降からRustが必須


FishのGithubからソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf fish-<バージョン>.tar.gz
cd fish-<バージョン>


または、git cloneコマンドを使用してソースコードをダウンロードする。

git clone https://github.com/fish-shell/fish-shell.git
cd fish-shell


Fishをビルドおよびインストールする。

mkdir build && cd build

# Fish 4.3以前
cmake -DCMAKE_BUILD_TYPE=Release \
      -DCMAKE_INSTALL_PREFIX=<Fishのインストールディレクトリ> \
      -DWITH_DOCS=ON    \
      -DWITH_GETTEXT=ON \
      ..

# Fish 4.4以降
cmake -DCMAKE_BUILD_TYPE=Release \
      -DCMAKE_INSTALL_PREFIX=<Fishのインストールディレクトリ> \
      -DWITH_DOCS=ON    \
      -DWITH_MESSAGE_LOCALIZATION=ON \
      ..

make -j $(nproc)
make install


設定

必要であれば、~/.profileファイル等にFishのパスを設定する。

vi ~/.profile


 # ~/.profileファイル
 
 export PATH="/<Fishのインストールディレクトリ>/bin:$PATH"



グローバルエイリアス

Fishでは、Zshにあるグローバルエイリアスは実装しない方針となっている。
これは、Fishが関数を多用するアーキテクチャであり、グローバルエイリアスが予期しない場所で展開される危険性があるためである。

Fishでグローバルエイリアスと同等の機能を実現するには、以下の方法がある。

  • abbr コマンドの --position anywhere オプションを使用する。(推奨)
  • fish_commandline_append 関数 や fish_commandline_prepend 関数を使用する。
  • bind コマンド と commandline コマンドを組み合わせて使用する。


グローバルエイリアスの実現方法の比較
方法 必要なバージョン 特徴
abbr --position anywhere Fish 3.6.0以降 公式推奨、[Space]キーで自動展開、履歴に展開後のコマンドが残る
fish_commandline_append関数 Fish 3.3.0以降 組み込み関数、トグル動作をサポート
bind関数 + commandline関数 全バージョン 柔軟なカスタマイズが可能、古いバージョンでも動作


abbr --position anywhereオプション (推奨)

Fish 3.6.0以降では、abbr コマンドの --positionanywhereオプションを使用することにより、コマンドラインのどこでも略語を展開できる。
これが公式に推奨されるグローバルエイリアスの代替手法である。

基本的な使用方法

以下の例では、Lと入力して[Space]キーを押下すると、| lessに展開される。

 # グローバル展開の略語を追加
 abbr -a --position anywhere -- L '| less'
 abbr -a --position anywhere -- H '| head'
 abbr -a --position anywhere -- T '| tail'
 abbr -a --position anywhere -- G '| grep'
 abbr -a --position anywhere -- W '| wc -l'
 abbr -a --position anywhere -- S '| sort'


上記の設定を永続化するには、~/.config/fish/config.fish ファイルに記述する。

--set-cursorオプション

--set-cursor オプションを使用すると、展開後のカーソル位置を指定できる。
マーカー (デフォルトは % ) の位置にカーソルが移動して、マーカーは削除される。

 # 展開後、カーソルがパイプの前に位置する
 abbr -a --position anywhere --set-cursor -- L '% | less'
 
 # 展開後、カーソルがgrepの引数位置に移動する
 abbr -a --position anywhere --set-cursor -- G '| grep %'


--commandオプション (Fish 4.0以降)

Fish 4.0以降では、--command オプションを使用して、特定のコマンドの引数としてのみ略語を展開できる。

 # gitコマンドでのみ展開される略語
 abbr --add --command git -- co checkout
 abbr --add --command git -- sw switch
 abbr --add --command git -- br branch
 abbr --add --command git -- st status
 
 # 使用例
 # git co main  → git checkout main に展開される
 # echo co      → 展開されない


--functionオプション

--function オプションを使用すると、関数を実行して動的に展開内容を生成できる。

   # 現在の日付を挿入する略語
   function _abbr_date
      echo (date +%Y-%m-%d)
   end
   abbr -a --position anywhere --function _abbr_date -- DATE

   # 使用例
   # echo DATE  → echo 2025-01-15 に展開される (日付は実行時の値)


--regexオプション

--regexオプションを使用すると、正規表現 (PCRE2) でマッチングできる。

 # .txtファイルをvimで開く略語
 function _abbr_vim_txt
    echo "vim $argv"
 end
 abbr -a --position anywhere --regex --function _abbr_vim_txt -- '.+\.txt'


fish_commandline_append関数とfish_commandline_prepend関数

Fish 3.3.0以降では、fish_commandline_append 関数 と fish_commandline_prepend 関数が組み込まれている。
これらの関数はトグル動作をサポートしており、既にコマンドラインに存在する場合は削除される。

fish_commandline_append関数とfish_commandline_prepend関数
関数 説明 デフォルトのキーバインド
fish_commandline_prepend コマンドラインの先頭に追加 [Alt] + [S]キー (sudo追加)
fish_commandline_append コマンドラインの末尾に追加 なし


以下の例では、キーバインドを設定して、パイプコマンドを簡単に追加できるようにしている。

vi ~/.config/fish/config.fish


 # [Alt] + [L]キーで "| less" を追加
 bind \el 'fish_commandline_append "| less"'
 
 # [Alt] + [G]キーで "| grep " を追加
 bind \eg 'fish_commandline_append "| grep "'
 
 # [Alt] + [H]キーで "| head" を追加
 bind \eh 'fish_commandline_append "| head"'
 
 # [Alt] + [T]キーで "| tail" を追加
 bind \et 'fish_commandline_append "| tail"'


bindコマンドとcommandlineコマンドを使用する方法

bind コマンド と commandline コマンドを組み合わせることにより、柔軟なグローバルエイリアスを実現できる。

以下の例では、コマンドラインに l と入力した状態で[Ctrl] + [X]キーを同時押下することにより、|less に展開されるように設定している。
headコマンド、tailコマンド、grepコマンド等も同様に設定可能である。

  vi ~/.config/fish/bind_global_alias.fish


 # ~/.config/fish/bind_global_alias.fishファイル
 
 function bind_global_alias
    switch (commandline -t)
       case "l"
          commandline -rt '| less'
       case "h"
          commandline -rt '| head'
       case "t"
          commandline -rt '| tail'
       case "g"
          commandline -rt '| grep'
       case grep
          commandline -rt 'grep -iE '
       case prog
          commandline -rt '& progress -mp $last_pid'
       case progress
          commandline -rt '& progress -mp $last_pid'
    end
 end
 
 # [Ctrl] + [X]キーに対応
 bind \cx bind_global_alias
 
 # [Alt] + [X]キーに対応
 bind \ex bind_global_alias


上記のファイルを作成した後、~/.config/fish/config.fish ファイルで読み込む設定を追加する。

vi ~/.config/fish/config.fish


 # グローバルエイリアスの読み込み
 source ~/.config/fish/bind_global_alias.fish


使用例

グローバルエイリアスを使用するには、展開したい文字を入力した後、設定したキー ([Ctrl] + [X]キー または [Alt] + [X]キー) を押下する。

  • l と入力して[Ctrl] + [X]キーを押下
    | less に展開される
  • h と入力して[Ctrl] + [X]キーを押下
    | head に展開される
  • t と入力して[Ctrl] + [X]キーを押下
    | tail に展開される
  • g と入力して[Ctrl] + [X]キーを押下
    | grep に展開される


例えば、cat /var/log/messages l と入力して[Ctrl] + [X]キーを押下すると、cat /var/log/messages | less に展開される。

独自のグローバルエイリアスを追加する

独自のグローバルエイリアスを追加するには、switch文の中にcaseを追加する。

 case "<展開前の文字列>"
    commandline -rt '<展開後の文字列>'


以下に、独自のグローバルエイリアスの追加例を示す。

 # wcコマンドにパイプする
 case "w"
    commandline -rt '| wc -l'
 
 # sortコマンドにパイプする
 case "s"
    commandline -rt '| sort'
 
 # xargsコマンドにパイプする
 case "x"
    commandline -rt '| xargs '



FisherManのインストール

FisherManのインストール

FisherManは、Fishのパッケージ管理ツールである。
Fishプラグインのインストール、アップデート、削除において、Fishのタブ補完機能と豊富な構文の強調表示を利用してインタラクティブに行うことができる。

関数、補完、バインディング、スニペットをコマンドラインから管理できる。
シェルの機能を拡張して、プロンプトの外観を変更および異なるシステム間で再現可能な設定を簡単に作成できる。
また、FisherManは、Oh My Fishもサポートしている。

FisherManをインストールするには、以下のコマンドを実行する。

curl -sL https://git.io/fisher | source && fisher install jorgebucaran/fisher


Fishプラグインのインストール

Fishプラグインをインストールするには、installコマンドの後にGitHub上のリポジトリへのパスを指定する。

fisher install ilancosman/tide


Fishプラグインの特定のバージョンを取得するには、プラグイン名の後に@マークを付け、タグ、ブランチ、またはコミットを付加する。

fisher install jorgebucaran/nvm.fish@2.1.0


ローカルディレクトリからFishプラグインをインストールすることもできる。

fisher install /<Fishプラグインがあるローカルディレクトリ>


FisherManは、FishプラグインをFishの設定ディレクトリに展開して、既存のファイルを上書きする。
この動作を変更する場合は、$fisher_pathを任意の場所に設定して、関数のパスに入れること。

インストールされているFishプラグインの表示

現在インストールされている全てのFishプラグインを表示するには、listコマンドを使用する。
listコマンドには、出力をフィルタリングするための正規表現を指定することもできる。

fisher list
fisher list \^/


Fishプラグインの更新

個別にFishプラグインを最新に更新するには、以下のコマンドを実行する。

fisher update jorgebucaran/fisher


全てのFishプラグインを最新に更新するには、以下のコマンドを実行する。

fisher update


Fishプラグインのアンインストール

個別にFishプラグインをアンインストールするには、以下のコマンドを実行する。

fisher remove jorgebucaran/nvm.fish
fisher remove jorgebucaran/nvm.fish@2.1.0


全てのFishプラグインをアンインストールするには、以下のコマンドを実行する。

fisher list | fisher remove



Pecoのインストール

Pecoは、Goで記述されたシンプルな対話型フィルタリングツールである。
grepコマンドと異なり、タイプしながら現在の結果を閲覧することができるため、ログ、プロセス統計、ファイルの検索等のフィルタリングに最適である。

  • インストール方法 1 (推奨)
    PecoのGithubにアクセスして、Pecoをダウンロードして解凍する。
    tar xf peco_linux_<アーキテクチャ名>.tar.gz

    解凍したディレクトリを任意のディレクトリに配置する。
    推奨するディレクトリは、/<Fishのインストールディレクトリ>/binディレクトリである。
    ~/.profileファイル等に、配置したディレクトリの環境変数PATHを追加する。
    vi ~/.profile

     # ~/.profileファイル
     
     export PATH="<Pecoのインストールディレクトリ>:$PATH"
    

  • インストール方法 2
    PecoのGitHubから、ソースコードをダウンロードする。
    この時、GOのインストールディレクトリ内にクローンする。(例. /<GOのインストールディレクトリ>/src/github.com/peco/peco)
    これは、メインのバイナリが内部パッケージを参照しているため、ソースコードが正しいパッケージの場所に置かれている必要があるからである。
    git clone https://github.com/peco/peco.git peco

    ダウンロードしたディレクトリに移動して、Pecoをビルドする。
    make build

    次に、releases/<バージョン>ディレクトリにpecoをインストールする。
    go build

    生成された実行ファイルを、例えば、/<Fishのインストールディレクトリ>/binディレクトリ等にコピーする。
    これは、Pecoの依存関係の正しいバージョンをインストールしている。

    続いて、Pecoをビルドする。
    これにより、クローンされたPecoリポジトリのルートにPecoの実行ファイルがコンパイルされる。
    go build cmd/peco/peco.go

    cmd/peco/ディレクトリにあるpeco.goファイルを、任意の場所にコピーする。



Oh My Fishのインストール

Oh My Fishは何年もメンテナンスされていないため、複数のテーマやパッケージが壊れており、特定の部分が動作しない可能性がある。

Curlコマンドからインストール

Curlコマンドを実行して、Oh My Fishをダウンロードする。

curl -L https://get.oh-my.fish > install


Oh My Fishをインストールする。

fish install --path=~/.local/share/omf --config=~/.config/omf


Githubからダウンロードしてインストール

Oh My FishのGithubからOh My Fishをダウンロードする。
または、以下のコマンド実行する。

git clone https://github.com/oh-my-fish/oh-my-fish.git


Oh My Fishをインストールする。

# Gitからインストールする場合
git clone https://github.com/oh-my-fish/oh-my-fish
cd oh-my-fish
bin/install --offline

# Tarballからインストールする場合
curl -L https://get.oh-my.fish > install
fish install --offline=omf.tar.gz



ログインシェルの変更

Fishを利用可能なシェル一覧に追加する。
/etc/shellsファイルにFishのパスを追加することにより、chshコマンド、または、usermodコマンドでログインシェルの変更が可能となる。

echo "/<Fishのインストールディレクトリ>/bin/fish" | sudo tee -a /etc/shells


次に、ユーザのログインシェルを変更する。(パスワードの入力が必要となる)

chsh -s /<Fishのインストールディレクトリ>/bin/fish $USER
# または
sudo usermod --shell /<Fishのインストールディレクトリ>/bin/fish $USER


ログインシェルが変更されているかどうかを確認する。

grep $USER /etc/passwd


再ログイン、または、PCを再起動する。


ベルの設定

以下の例では、sudoコマンドを実行してパスワード認証する場合、ベルを鳴らしている。

Fishの設定ファイルを開く。

vi ~/.config/fish/config.fish


 # ~/.config/fish/config.fishファイル
 
 # ベルを有効化
 ## デフォルトのキーバインディングを使用
 ## -Uフラグはユニバーサル変数として設定 (全てのセッションで有効)
 set -U fish_key_bindings fish_default_key_bindings
 
 ## ベルを明示的に有効化
 ## -gフラグはグローバル変数として設定
 set -g fish_ring_bell on
 
 # sudoのエイリアスを作成してベルを追加
 function sudo
    # パスワード入力の前にベル音を鳴らす
    command echo -ne "\a"
 
    # 元のsudoコマンドを実行
    command sudo $argv
 end