fish

提供: ArchWiki
2016年1月1日 (金) 19:30時点におけるKusakata (トーク | 投稿記録)による版 (未訳部分の翻訳)
ナビゲーションに移動 検索に移動

fish (friendly interactive shell) は主に対話的に使用することを意図されたユーザフレンドリーなコマンドラインシェルです。

インストール

公式リポジトリより、主流フォーク の安定版 fish パッケージをインストールできます。

最新の開発版は AUR より fish-shell-gitAUR[リンク切れ: アーカイブ: aur-mirror]インストールします。

2011年に オリジナルの開発者 による 開発が中止された 従来のバージョンは AUR より fish-gitAURインストールします。

fish をデフォルトシェルにするには、chsh -s /usr/bin/fish を実行します。

入出力

ファイル記述子

他のシェルと同じように、入出力ストリームをリダイレクトすることが fish でも出来ます。テキストファイルを使ってプログラムのエラー出力を保存したり、テキストファイルを入力したりする場合に有用です。ほとんどのプログラムは3つの入出力ストリームを使います。ファイル記述子 (FD) と呼ばれる番号で表されます:

  • 標準入力 (FD 0) は読み取りに使われます (デフォルトではキーボード)。
  • 標準出力 (FD 1) は書き込みに使われます (デフォルトではスクリーン)。
  • 標準エラー (FD 2) はエラーや警告の表示に使われます (デフォルトではスクリーン)。

リダイレクト

リダイレクトという仕組みを使うことでファイル記述子の出力先を他のファイルに変えることができます:

標準入力をリダイレクト:
$ command < source_file

標準出力をリダイレクト:
$ command > destination

既存のファイルに標準出力を追記:
$ command >> destination

標準エラーをリダイレクト:
$ command ^ destination

既存のファイルに標準エラーを追記:
$ command ^^ destination

destination には以下のどれかを使えます:

  • ファイル名 (出力は指定されたファイルに書き込まれます)。
  • & と他のファイル記述子の番号。出力は他のファイル記述子に書き込まれます。
  • &- 記号。出力はどこにも書き込まれません。

例:

標準出力をファイルにリダイレクト:
$ command > destination_file.txt

標準出力と標準出力の両方を同じファイルにリダイレクト:
$ command > destination_file.txt ^ &1

標準出力を消す:
$ command > &-

パイプ

あるコマンドの標準出力を次のコマンドの標準入力にリダイレクトすることができます。パイプ文字 (|) を使ってコマンドを区切って下さい。例:

cat example.txt | head

(標準出力だけでなく) 他のファイル記述子をパイプにリダイレクトすることもできます。次の例では、標準エラーのファイル記述子の番号と > をパイプに付けることで、あるコマンドの標準エラーを他のコマンドの標準入力に流し込んでいます:

$ command 2>| less

上記を実行すると command が実行されてから標準エラーが less コマンドにリダイレクトされます。

設定

fish のユーザー設定ファイルは ~/.config/fish/config.fish に存在しています。.bashrc と同じように、ターミナルが開かれる時に実行/定義するコマンド、関数を追加します。

ウェブインターフェイス

fish のプロンプトとターミナルの色はウェブインターフェイスで対話的に設定できます:

fish_config

選択した設定は、個人用の設定ファイルに書き込まれます。また、定義された関数と履歴を表示することができます。

プロンプト

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

コマンド補完

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 に含まれています。メモリ管理が賢いために、リソースに悪影響を与えることはありません。

/etc/profile と ~/.profile の互換性

POSIX 標準の sh の構文は fish と互換性がないため、fish では /etc/profile (そして /etc/profile.d*.sh ファイル) や ~/.profile を source することはできません。

これらのファイルを fish で source したい場合、dash をインストールして以下の行を config.fish に追加してください:

env -i HOME=$HOME dash -l -c printenv | sed -e '/PATH/s/:/ /g;s/=/ /;s/^/set -x /' | source

組み込まれているコマンドを使うことで実行ファイルの呼び出しを省くこともできます:

env -i HOME=$HOME dash -l -c 'export -p' | sed -e "/PATH/s/'//g;/PATH/s/:/ /g;s/=/ /;s/^export/set -x/" | source

Tips and Tricks

履歴置換

Fish は履歴置換 (例: sudo !!) を実装しておらず、fish の開発者は 実装する予定もない と発言しています。しかしながら、履歴置換は多くのユーザーにとって必要不可欠な機能です。Reddit ユーザーの crossroads1112 が履歴置換の機能を再現した関数を作成しています (ただし構文は異なっています)。関数は github にあり、使い方はコメントとして書いてあります。オリジナルの構文に近づけた フォークバージョン も存在し、ヘルパー関数でコマンドを指定すれば command !! が使えます。

トラブルシューティング

Arch では、シェルスクリプトの多くは Bash 向けに書かれており、fish に翻訳されていません。そのため、fish をデフォルトシェルに設定しないほうが得策です。fish を実行するコマンドラインオプションを指定してターミナルエミュレータを開くのが一番良いと思われます。ほとんどのターミナルでは -e スイッチを使います。例えば、fish で gnome-terminal を開きたいときは、使用するショートカットを以下のように変更してください:

gnome-terminal -e fish

LilyTerm などシェルの設定をサポートしていない軽量なターミナルエミュレータでは以下のようにします:

SHELL=/usr/bin/fish lilyterm

ターミナルの設定や (ターミナルエミュレータにプロファイル機能がある場合) ターミナルのプロファイルに、ターミナルのデフォルトシェルとして fish を設定する方法もあります。ユーザーのデフォルトシェルを変更することで上記の問題が発生するのとは対照的な設定方法です。

tmux で起動するシェルとして fish を設定するには、~/.tmux.conf に以下を記述:

set-option -g default-shell "/usr/bin/fish"

システム全体のデフォルトシェルとして fish を設定しないことで、起動時に arch スクリプトを動作させることができ、環境変数は正しく設定され、その他、fish などの Bash と互換性がないターミナルを使用することによる問題を少なくすることが可能です。

fish をデフォルトシェルとして設定した場合、パスが正しく設定されていないことに気づくでしょう。~/.config/fish/config.fish にセクションを追加してログイン時にパスを適切に設定することができます。ログインシェルの場合だけ実行される .profile.bash_profile と同じです。

if status --is-login
        set PATH $PATH /usr/bin /sbin
end

$MOZ_PLUGIN_PATH など、他の環境変数も手動で追加する必要があります。fish をデフォルトシェルとしてシームレスに使えるようにするには骨が折れる作業量になります。

su で bash が起動する

su で bash が起動する場合 (Bash がデフォルトシェルのため)、fish に関数を定義してください:

$ funced su
function su
        /bin/su --shell=/usr/bin/fish $argv
end
$ funcsave su

ログイン時に X を起動

~/.config/fish/config.fish の一番下に以下を追加します:

# start X at login
if status --is-login
    if test -z "$DISPLAY" -a $XDG_VTNR -eq 1
        exec startx -- -keeptty
    end
end
ノート: fish 使用時に startx-keeptty フラグを必要とする理由については この記事 を参照してください。

参照