fish
fish (friendly interactive shell) は主に対話的に使用することを意図されたユーザフレンドリーなコマンドラインシェルです。
目次
- 1 インストール
- 2 システムへの統合
- 3 設定
- 4 ヒントとテクニック
- 5 トラブルシューティング
- 6 参照
インストール
fish パッケージをインストールしてください。開発版は fish-gitAUR パッケージでインストールできます。
fish をデフォルトシェルにしたい場合は、シェル#デフォルトシェルを変更するを見てください。ただし、fish はデフォルトシェルにしないことを推奨します。
インストールしたら fish
を実行することで fish シェルが起動します。
ドキュメントは fish から help
を実行することでウェブブラウザが開いて確認できます。fish の構文は他のシェルと異なっているので、最低でも "Syntax overview" セクションを読むことを推奨します。
システムへの統合
fish をデフォルトのユーザーシェルとするのか、つまりログイン時に直接 fish に入るのか、それとも現在のデフォルトシェルの子プロセスとしてインタラクティブシェルモードで使用するのか、ここでは後者を Bash と仮定しています。この2つの設定について詳しく説明します。
- デフォルトシェル として使用される fish: このモードでは、fish の機能とそのスクリプト言語に関する基本的な理解が必要です。ユーザーの現在の初期化スクリプトと環境変数を新しい fish 環境に移行する必要があります。このモードでシステムを設定するには、fish をデフォルトのシェルとして設定する に従ってください。
- インタラクティブシェルオンリー: このモードでは、Bash の初期化スクリプトは通常通り実行され、fish はターミナルに接続された対話型モードで Bash の上で実行されるため、混乱が少ないモードです。このモードで fish を設定するには、fish をインタラクティブシェルとして設定する に従ってください。
fish をデフォルトのシェルとして設定する
fish をデフォルトのユーザーシェルとして設定することに決めた場合、最初のステップは、この特定のユーザーのシェルを /usr/bin/fish
に設定することです。これは、コマンドラインシェル#デフォルトシェルを変更する の説明に従って行うことができます。
次のステップは、様々な Bash の初期化スクリプト、すなわち /etc/profile
, ~/.bash_profile
, /etc/bash.bashrc
, ~/.bashrc
で行われる現在必要な動作と設定を、fish フレームワークに移植するものです。
特に、環境変数 $PATH
の内容は、一度 fish に直接ログインして確認し、自分の必要性に応じて調整することが必要です。fish では、$PATH
は グローバル環境変数 として定義されています。すべての機能にわたって グローバル なスコープを持ち、再起動すると失われ、子プロセスにエクスポートされる 環境変数 となります。パスに場所を追加する推奨方法は、config.fish
から fish_add_path コマンドを呼び出す方法です。例えば
$ fish_add_path -p /first/path /second/path /third/one
これら 3つの場所がパスの先頭に追加されます。
fish をインタラクティブシェルとして設定する
fish をシステム全体またはユーザーのデフォルトとして設定しないと、起動時に現在の Bash スクリプトを実行できます。これにより、現在のユーザーの環境変数が変更されず、Bash の子として実行される fish にエクスポートされます。以下は、fish をデフォルトのシェルとして設定せずにインタラクティブシェルモードで実行するいくつかの方法です。
.bashrc を変更して fish にドロップするようにします
デフォルトのシェルを Bash にして、 exec fish
という行を .bashrc
などの適切な Bash#設定ファイル に追加するだけでよいのです。これにより、Bash は /etc/profile
と /etc/profile.d
にあるすべてのファイルを適切にソースするようになります。fish は Bash のプロセスを置き換えるので、fish を終了すると端末も終了します。以下のオプションと比較すると、これはローカルマシンでも SSH サーバでも動作するため、最も普遍的な解決策と言えます。
ターミナルエミュレータでオプションを使用する
もうひとつの方法は、fish を実行するコマンドラインオプションを指定してターミナルエミュレータを開くことです。ほとんどのターミナルでは、これは -e
スイッチなので、たとえば fish を使って gnome-terminal を開くには、ショートカットを変更してください。
gnome-terminal -e fish
lilyterm-gitAUR など、シェルの設定をサポートしていない端末エミュレーターでは、次のようになります。
SHELL=/usr/bin/fish lilyterm
また、ターミナルによっては、ターミナル設定またはターミナルプロファイルで fish をデフォルトのシェルとして設定できる場合があります。
ターミナルマルチプレクサでオプションを使用する
tmux で開始されたシェルとして fish を設定するには、これを ~/.tmux.conf
に入れます:
set-option -g default-shell "/usr/bin/fish"
tmux を実行するたびに、fish にドロップされます。
設定
fish のユーザー設定ファイルは ~/.config/fish/config.fish
に存在しています。.bashrc
と同じように、ターミナルが開かれる時に実行/定義するコマンド、関数を追加します。
ウェブインターフェイス
fish のプロンプトとターミナルの色はウェブインターフェイスで対話的に設定できます:
fish_config
選択した設定は、個人用の設定ファイルに書き込まれます。また、定義された関数と履歴を表示することができます。
コマンド補完
fish は man ページから自動補完を生成できます。~/.config/fish/generated_completions/
に補完が書き込まれており、以下を呼び出すことによって生成することができます:
fish_update_completions
また、独自の補完を ~/.config/fish/completions/
に定義できます。/usr/share/fish/completions/
でいくつかの例を見ることができます。
fish の開発元のポリシーが、上流の tarball に存在する補完を全て含めるというものなので pacman, pacman-key, makepkg, cower, pbget, pacmatic などの Arch Linux 固有のコマンドの文脈に沿った補完も fish に含まれています。メモリ管理が賢いために、リソースに悪影響を与えることはありません。
ヒントとテクニック
fish をデフォルトシェルに設定しない
Arch ではシェルスクリプトは Bash を使って書かれており、fish と完全な互換性がありません。fish をデフォルトシェルに設定しないことで、起動時に実行される Bash スクリプトで環境変数を正しく設定できます。また、fish などの Bash 非互換のターミナルを使った場合に起こる問題を避けられます。デフォルトシェルを fish に設定するとスクリプトエラーが発生します。以下では fish をデフォルトシェルに設定しないで使用する方法を説明しています。
.bashrc から fish を起動する
デフォルトシェルを Bash のままにしておいて exec fish
という行をシェルの設定ファイル (例: .bashrc
) に追加してください。これで Bash が /etc/profile
や /etc/profile.d
のファイルを正しく読み込んでくれます。fish は bash のプロセスを置き換えるため、fish を終了するとターミナルも終了します。ローカルマシンだけでなく SSH サーバーでも使える方法のため、以下で説明する方法よりも汎用的です。
ターミナルエミュレータのオプションを使用する
fish を起動するコマンドラインオプションを使用してターミナルエミュレータを開くという方法もあります。大抵のターミナルでは -e
スイッチを使います。例えば fish を使用して gnome-terminal を開くには、ショートカットを以下のように変更してください:
gnome-terminal -e fish
シェルの設定をサポートしていない LilyTerm などの軽量ターミナルエミュレータでは以下のように設定してください:
SHELL=/usr/bin/fish lilyterm
ターミナルの設定からターミナルのデフォルトシェルを fish に設定できたり、ターミナルエミュレータにプロファイル機能がある場合、ターミナルプロファイルで設定できることがあります。
どちらにしてもターミナルエミュレータを開いたら、fish が起動するようになります。
ターミナルマルチプレクサのオプションを使用する
tmux で起動するシェルを fish に設定するには、以下を ~/.tmux.conf
に記述してください:
set-option -g default-shell "/usr/bin/fish"
tmux を起動すると fish が立ち上がるようになります。
fish をデフォルトシェルに設定する
fish をデフォルトシェルとして設定した場合、パスが正しく設定されていないことに気づくでしょう。~/.config/fish/config.fish
ファイルにセクションを追加してログイン時にパスを適切に設定することができます。ログインシェルの場合だけ実行される .profile
や .bash_profile
と同じです。
if status --is-login set PATH $PATH /usr/bin /sbin end
グリーティングを無効化
デフォルトでは、fish は起動時にグリーティングメッセージを表示します。無効にするには、fish の設定ファイルに set fish_greeting
と追加してください。
su で fish を起動する
su で Bash が起動する場合、fish の設定ファイルに以下の関数を定義します:
function su /bin/su --shell=/usr/bin/fish $argv end
ログイン時に X を起動
以下を ~/.config/fish/config.fish
の最後に追加してください:
# Start X at login if status --is-login if test -z "$DISPLAY" -a $XDG_VTNR = 1 exec startx -- -keeptty end end
liquidprompt を使う
Liquidprompt は Bash と Zsh 用に作られたフル機能の人気のあるアダプティブプロンプトですが fish に対応する予定はありません [1]。fish-lp プロジェクト は fish で Liquidprompt を実装しています。
プロンプトに git の状態を表示する
カレントディレクトリが git ディレクトリの場合に fish でブランチなどの状態を表示するには、以下を ~/.config/fish/config.fish
に追加します:
# fish git prompt set __fish_git_prompt_showdirtystate 'yes' set __fish_git_prompt_showstashstate 'yes' set __fish_git_prompt_showupstream 'yes' set __fish_git_prompt_color_branch yellow # Status Chars set __fish_git_prompt_char_dirtystate '⚡' set __fish_git_prompt_char_stagedstate '→' set __fish_git_prompt_char_stashstate '↩' set __fish_git_prompt_char_upstream_ahead '↑' set __fish_git_prompt_char_upstream_behind '↓' function fish_prompt set last_status $status set_color $fish_color_cwd printf '%s' (prompt_pwd) set_color normal printf '%s ' (__fish_git_prompt) set_color normal end
SSH のプロンプトでホスト名に色を付ける
SSH 経由で接続するたびにプロンプトでホスト名を動的に色付けするには、fish_prompt 関数または fish 設定ファイルのいずれかに次の行を追加します。ここでは赤色を使用しています。
~/.config/fish/functions/fish_prompt.fish
... if set -q SSH_TTY set -g fish_color_host brred end ...
ssh-agent の評価
fish では適切な変数が設定されていないため eval (ssh-agent)
を実行するとエラーが生成されます。この問題を解決するには、csh 風のオプションである -c
を使ってください:
$ eval (ssh-agent -c)
"command not found" フック
pkgfile には "command not found" フックが含まれており、認識できないコマンドを入力したときに自動的に公式リポジトリが検索されます。pkgfile をインストールすると自動的にフックが実行されるようになっています。
ジョブリストからプロセスを削除する
fish を終了するとバックグラウンドで実行されているジョブは全て fish によって終了されます。fish の終了後もジョブを実行し続けるには disown
を使ってください。例えば、以下のコマンドは firefox
をバックグラウンドで起動してからプロセスとの関係を断ち切ります:
$ firefox & $ disown
fish のプロセスが終了しても firefox が閉じられることはありません。詳しくは fish で disown(1) の man ページを見てください。
一時的なエイリアスを永続化する
fish シェルを開いて以下のようにコマンドを実行することで簡単に永続的なエイリアスを作成することができます。
$ alias lsl "ls -l" $ funcsave lsl
fish バージョン3.0 以降では、エイリアス --save(-s) オプションをサポートしています。
$ alias -s lsl "ls-l"
これは関数を作成します。
function lsl ls -l $argv end
fish のシェル関数としてエイリアスが設定されます。シェル関数を確認・編集したい場合、fish_config
を使って作成されるウェブ設定ページの Function ページから全ての関数を閲覧できます。
詳細については、 alias - create a function — fish-shell
トラブルシューティング
履歴置換
Fish は履歴置換 (例: sudo !!
) を実装しておらず、fish の開発者は 実装する予定もない と発言しています。しかしながら、履歴置換は多くのユーザーにとって必要不可欠な機能です。Reddit ユーザーの crossroads1112 が履歴置換の機能を再現した関数を作成しています (ただし構文は異なっています)。関数は github にあり、使い方はコメントとして書いてあります。オリジナルの構文に近づけた フォークバージョン も存在し、ヘルパー関数でコマンドを指定すれば command !!
が使えます。
command !!
を使用できるようにする方法は Fish の github wiki にもあります。bind_bang
関数で !!
をコマンド履歴の最後のコマンドに展開する例が載っています。こちらの github issue も参照してください。
参照
- http://fishshell.com/ - ホームページ
- http://fishshell.com/docs/current/index.html - ドキュメント
- http://hyperpolyglot.org/unix-shells - シェル文法の対応表