「Fish」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎入出力: 同期)
17行目: 17行目:
 
ドキュメントは fish から {{ic|help}} を実行することでウェブブラウザが開いて確認できます。fish の構文は他のシェルと異なっているので、最低でも "Syntax overview" セクションを読むことを推奨します。
 
ドキュメントは fish から {{ic|help}} を実行することでウェブブラウザが開いて確認できます。fish の構文は他のシェルと異なっているので、最低でも "Syntax overview" セクションを読むことを推奨します。
   
  +
== システムへの統合 ==
== 入出力 ==
 
   
  +
fish をデフォルトのユーザーシェルとするのか、つまりログイン時に直接 fish に入るのか、それとも現在のデフォルトシェルの子プロセスとしてインタラクティブシェルモードで使用するのか、ここでは後者を [[Bash]] と仮定しています。この2つの設定について詳しく説明します。
=== ファイル記述子 ===
 
他のシェルと同じように、入出力ストリームをリダイレクトすることが fish でも出来ます。テキストファイルを使ってプログラムのエラー出力を保存したり、テキストファイルを入力したりする場合に有用です。ほとんどのプログラムは3つの入出力ストリームを使います。ファイル記述子 (FD) と呼ばれる番号で表されます:
 
   
  +
* '''デフォルトシェル''' として使用される fish: このモードでは、fish の機能とそのスクリプト言語に関する基本的な理解が必要です。ユーザーの現在の初期化スクリプトと環境変数を新しい fish 環境に移行する必要があります。このモードでシステムを設定するには、[[fish#fish をデフォルトのシェルとして設定する|fish をデフォルトのシェルとして設定する]] に従ってください。
* 標準入力 (FD 0) は読み取りに使われます (デフォルトではキーボード)。
 
  +
* '''インタラクティブシェルオンリー''': このモードでは、Bash の初期化スクリプトは通常通り実行され、fish はターミナルに接続された対話型モードで Bash の上で実行されるため、混乱が少ないモードです。このモードで fish を設定するには、[[fish#fish をインタラクティブシェルとして設定する|fish をインタラクティブシェルとして設定する]] に従ってください。
* 標準出力 (FD 1) は書き込みに使われます (デフォルトではスクリーン)。
 
* 標準エラー (FD 2) はエラーや警告の表示に使われます (デフォルトではスクリーン)。
 
   
  +
=== fish をデフォルトのシェルとして設定する ===
=== リダイレクト ===
 
リダイレクトという仕組みを使うことでファイル記述子の出力先を他のファイルに変えることができます:
 
   
  +
fish をデフォルトのユーザーシェルとして設定することに決めた場合、最初のステップは、この特定のユーザーのシェルを {{ic|/usr/bin/fish}} に設定することです。これは、[[コマンドラインシェル#デフォルトシェルを変更する]] の説明に従って行うことができます。
{{bc|''標準入力をリダイレクト:''
 
$ command < source_file
 
   
  +
次のステップは、様々な Bash の初期化スクリプト、すなわち {{ic|/etc/profile}}, {{ic|~/.bash_profile}}, {{ic|/etc/bash.bashrc}}, {{ic|~/.bashrc}} で行われる現在必要な動作と設定を、fish フレームワークに移植するものです。
''標準出力をリダイレクト:''
 
$ command > destination
 
   
  +
特に、環境変数 {{ic|$PATH}} の内容は、一度 fish に直接ログインして確認し、自分の必要性に応じて調整することが必要です。fish では、{{ic|$PATH}} は ''グローバル環境変数'' として定義されています。すべての機能にわたって ''グローバル'' なスコープを持ち、再起動すると失われ、子プロセスにエクスポートされる ''環境変数'' となります。パスに場所を追加する推奨方法は、{{ic|config.fish}} から [https://fishshell.com/docs/current/cmds/fish_add_path.html fish_add_path] コマンドを呼び出す方法です。例えば
''既存のファイルに標準出力を追記:''
 
$ command >> destination
 
   
  +
$ fish_add_path -p ''/first/path'' ''/second/path'' ''/third/one''
''標準エラーをリダイレクト:''
 
$ command ^ destination
 
   
  +
これら 3つの場所がパスの先頭に追加されます。
''既存のファイルに標準エラーを追記:''
 
$ command ^^ destination}}
 
   
  +
=== fish をインタラクティブシェルとして設定する ===
{{ic|destination}} には以下のどれかを使えます:
 
   
  +
fish をシステム全体またはユーザーのデフォルトとして設定しないと、起動時に現在の Bash スクリプトを実行できます。これにより、現在のユーザーの環境変数が変更されず、Bash の子として実行される fish にエクスポートされます。以下は、fish をデフォルトのシェルとして設定せずにインタラクティブシェルモードで実行するいくつかの方法です。
* ファイル名 (出力は指定されたファイルに書き込まれます)。
 
* {{ic|&}} と他のファイル記述子の番号。出力は他のファイル記述子に書き込まれます。
 
* {{ic|&}} と {{ic|-}} 記号。出力はどこにも書き込まれません。
 
   
  +
==== .bashrc を変更して fish にドロップするようにします ====
例:
 
{{bc|''標準出力をファイルにリダイレクト:''
 
$ command > destination_file.txt
 
   
  +
デフォルトのシェルを Bash にして、 {{ic|exec fish}} という行を {{ic|.bashrc}} などの適切な [[Bash#設定ファイル]] に追加するだけでよいのです。これにより、Bash は {{ic|/etc/profile}} と {{ic|/etc/profile.d}} にあるすべてのファイルを適切にソースするようになります。fish は Bash のプロセスを置き換えるので、fish を終了すると端末も終了します。以下のオプションと比較すると、これはローカルマシンでも SSH サーバでも動作するため、最も普遍的な解決策と言えます。
''標準出力と標準出力の両方を同じファイルにリダイレクト:''
 
$ command > destination_file.txt ^ &1
 
   
  +
{{Tip|
''標準出力を消す:''
 
  +
* このセットアップでは、{{ic|bash --norc}} を使用して、{{ic|~/.bashrc}} からコマンドを実行せずに手動で Bash に入り、{{ic|exec fish}} を実行して fish に戻ります。
$ command > &-}}
 
  +
* {{ic|bash -c 'echo test'}} のようなコマンドを fish の起動ではなくBashで実行させるには、代わりに {{ic|if [ -z "$BASH_EXECUTION_STRING" ]; then exec fish; fi}} と記述します。
  +
* 親プロセスが fish でない場合のみ、fish にドロップインします。これにより、{{ic|bash}} の設定を失うことなく、{{ic|~/.bashrc}} コマンドを実行することで bash に素早く入ることができます。
  +
{{bc|<nowiki>if [[ $(ps --no-header --pid=$PPID --format=comm) != "fish" && -z ${BASH_EXECUTION_STRING} ]]
  +
then
  +
exec fish
  +
fi</nowiki>}}
  +
}}
   
  +
==== ターミナルエミュレータでオプションを使用する ====
=== パイプ ===
 
   
  +
もうひとつの方法は、fish を実行するコマンドラインオプションを指定してターミナルエミュレータを開くことです。ほとんどのターミナルでは、これは {{ic|-e}} スイッチなので、たとえば fish を使って gnome-terminal を開くには、ショートカットを変更してください。
あるコマンドの標準出力を次のコマンドの標準入力にリダイレクトすることができます。パイプ文字 ({{ic|<nowiki>|</nowiki>}}) を使ってコマンドを区切って下さい。例:
 
   
  +
gnome-terminal -e fish
cat example.txt | head
 
   
  +
{{aur|lilyterm-git}} など、シェルの設定をサポートしていない端末エミュレーターでは、次のようになります。
(標準出力だけでなく) 他のファイル記述子をパイプにリダイレクトすることもできます。次の例では、標準エラーのファイル記述子の番号と {{ic|>}} をパイプに付けることで、あるコマンドの標準エラーを他のコマンドの標準入力に流し込んでいます:
 
   
  +
SHELL=/usr/bin/fish lilyterm
$ command 2>| less
 
   
  +
また、ターミナルによっては、ターミナル設定またはターミナルプロファイルで fish をデフォルトのシェルとして設定できる場合があります。
上記を実行すると {{ic|command}} が実行されてから標準エラーが {{ic|less}} コマンドにリダイレクトされます。
 
  +
  +
==== ターミナルマルチプレクサでオプションを使用する ====
  +
  +
[[tmux]] で開始されたシェルとして fish を設定するには、これを {{ic|~/.tmux.conf}} に入れます:
  +
  +
set-option -g default-shell "/usr/bin/fish"
  +
  +
''tmux'' を実行するたびに、fish にドロップされます。
   
 
== 設定 ==
 
== 設定 ==

2023年2月20日 (月) 06:23時点における版

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

インストール

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 サーバでも動作するため、最も普遍的な解決策と言えます。

ヒント:
  • このセットアップでは、bash --norc を使用して、~/.bashrc からコマンドを実行せずに手動で Bash に入り、exec fish を実行して fish に戻ります。
  • bash -c 'echo test' のようなコマンドを fish の起動ではなくBashで実行させるには、代わりに if [ -z "$BASH_EXECUTION_STRING" ]; then exec fish; fi と記述します。
  • 親プロセスが fish でない場合のみ、fish にドロップインします。これにより、bash の設定を失うことなく、~/.bashrc コマンドを実行することで bash に素早く入ることができます。
if [[ $(ps --no-header --pid=$PPID --format=comm) != "fish" && -z ${BASH_EXECUTION_STRING} ]]
then
	exec fish
fi

ターミナルエミュレータでオプションを使用する

もうひとつの方法は、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 サーバーでも使える方法のため、以下で説明する方法よりも汎用的です。

ヒント: 上記のように設定する場合、bash --norc を使うことで ~/.bashrc に書かれているコマンドを実行することなく Bash を開くことができます。普通に Bash を起動すると即座に Fish に戻ってしまいます。

ターミナルエミュレータのオプションを使用する

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
ノート: $MOZ_PLUGIN_PATH など、他の環境変数も手動で追加する必要があります。fish をデフォルトシェルとしてシームレスに使えるようにするには骨が折れる作業量になります。fish をデフォルトシェルに設定しない方が簡単です。

グリーティングを無効化

デフォルトでは、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 が閉じられることはありません。詳しくは fishdisown(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 も参照してください。

参照