fish
関連記事
fish (friendly interactive shell) は主に対話的に使用することを意図されたユーザフレンドリーな コマンドラインシェル です。
fish は意図的に POSIX に準拠しておらず、簡略化された構文または異なる構文を使用して POSIX の矛盾に対処することを目的としています。これは、単純な POSIX 準拠のスクリプトであっても、fish で実行するにはかなりの適応や完全な書き換えが必要になる可能性があることを意味します。
インストール
fish パッケージをインストールしてください。開発版は fish-gitAUR パッケージでインストールできます。
インストールしたら 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
にあるすべてのファイルを適切に source するようになります。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 にドロップされます。
設定
設定ファイルはログインごとに実行され、~/.config/fish/config.fish
にあります。ファイルにコマンドまたは関数を追加すると、.bashrc
と同様に、ターミナルを開いたときにそれらが実行/定義されます。変数を保存する必要がある場合は、前述の設定ファイルで定義するのではなく、変数を ユニバーサル として設定する必要があることに注意してください。
ユーザーの関数は、ディレクトリ ~/.config/fish/functions
のファイル名 function_name.fish
にあります。
ウェブインターフェイス
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 は Bash スタイルの履歴置換 (例:sudo !!
) を実装していません。開発者は fish faq で、代わりにインタラクティブな履歴呼び出しインターフェースを使用するよう推奨しています: Up
矢印は過去の行全体を呼び出し、Alt+Up
は個々の引数を呼び出します。(または Alt+.
) は個々の引数を呼び出し、Alt+s
は既存の行の前に sudo
を追加します。
しかし、いくつかの回避策が fish wiki に記述されています。完全な履歴置換はできませんが、いくつかの関数は !!!
を直前のコマンドに、!$
を直前の最終引数に置き換えます。
グリーティングを無効化
デフォルトでは、fish は起動時にグリーティングメッセージを表示します。無効にするには、次のコマンドを 1 回実行します:
$ set -U fish_greeting
これにより、すべての Fish インスタンスと共有され、シェルの再起動時に保存されるユニバーサル変数 fish_greeting
がクリアされます。
su で fish を起動する
su が Bash で始まる場合、Bash がターゲットユーザー (ユーザー名が指定されていない場合は root ) のデフォルトシェルですが、ユーザーのシェルに関係なく fish にリダイレクトする関数を定義することもできます:
~/.config/fish/functions/su.fish
function su command 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
プロンプトに git の状態を表示する
git ディレクトリにいるときに、fish にブランチやダーティの状態を表示させたい場合は、以下の fish_prompt
関数を定義するとよいでしょう。
~/.config/fish/functions/fish_prompt.fish
function fish_prompt set -l last_status $status if not set -q __fish_git_prompt_show_informative_status set -g __fish_git_prompt_show_informative_status 1 end if not set -q __fish_git_prompt_color_branch set -g __fish_git_prompt_color_branch brmagenta end if not set -q __fish_git_prompt_showupstream set -g __fish_git_prompt_showupstream "informative" end if not set -q __fish_git_prompt_showdirtystate set -g __fish_git_prompt_showdirtystate "yes" end if not set -q __fish_git_prompt_color_stagedstate set -g __fish_git_prompt_color_stagedstate yellow end if not set -q __fish_git_prompt_color_invalidstate set -g __fish_git_prompt_color_invalidstate red end if not set -q __fish_git_prompt_color_cleanstate set -g __fish_git_prompt_color_cleanstate brgreen end printf '%s%s %s%s%s%s ' (set_color $fish_color_host) (prompt_hostname) (set_color $fish_color_cwd) (prompt_pwd) (set_color normal) (__fish_git_prompt) if not test $last_status -eq 0 set_color $fish_color_error end echo -n '$ ' set_color normal end
しかし、これは現在では非推奨となっています。fish-shell git を参照してください。代わりに、Informative Git Prompt が fish に組み込まれ、必要であれば fish_config から起動できるようになりました。
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" フック
Fish には、"command not found" フックがあり、認識されないコマンドを入力すると自動的に公式リポジトリを検索します。このフックは pkgfile を使用して実行され、インストールされていない場合はpacman-F
にフォールバックされます。
3.2.2 以降では、 パフォーマンスが落ちる ため、"command not found" はデフォルトで pacman-F
にフォールバックしません。
この動作によって生じる遅延が望ましくない場合は、エラーメッセージのみを出力するように fish_command_not_found
を再定義することでこのフックをオーバーライドできます。
$ function fish_command_not_found __fish_default_command_not_found_handler $argv[1] end
この変更を永続的にするには、funcsave
ビルトインを使用します:
$ funcsave fish_command_not_found
ジョブリストからプロセスを削除する
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
ログイン時のソース /etc/profile
bash
とは異なり、fish
は tty ログインで /etc/profile
をソースにしません。このファイルのソースを
/etc/profile.d
ディレクトリに環境変数が追加され、宣言されている場合は、config に以下を追加します:
~/.config/fish/config.fish
# source /etc/profile with bash if status is-login exec bash -c "test -e /etc/profile && source /etc/profile;\ exec fish" end
bash
ログインセッションのように、ログインシェルとして fish
を実行しながら、通常使用するすべての環境変数を使用できます。
参照
- http://fishshell.com/ - ホームページ
- http://fishshell.com/docs/current/index.html - ドキュメント
- http://hyperpolyglot.org/unix-shells - シェル文法の対応表
- https://github.com/fish-shell/fish-shell - fish on GitHub