「Fish」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎ヒントとテクニック‎: SSH のプロンプトでホスト名に色を付ける、を翻訳して追加)
 
(2人の利用者による、間の13版が非表示)
1行目: 1行目:
 
{{lowercase title}}
 
{{lowercase title}}
[[Category:コマンドシェル]]
+
[[Category:コマンドラインシェル]]
 
[[de:Fish]]
 
[[de:Fish]]
 
[[en:Fish]]
 
[[en:Fish]]
 
[[ru:Fish]]
 
[[ru:Fish]]
 
[[zh-hans:Fish]]
 
[[zh-hans:Fish]]
  +
{{Related articles start}}
'''fish''' ('''friendly interactive shell''') は主に対話的に使用することを意図されたユーザフレンドリーな[[コマンドラインシェル]]です。
 
  +
{{Related|コマンドラインシェル}}
  +
{{Related articles end}}
  +
'''fish''' ('''friendly interactive shell''') は主に対話的に使用することを意図されたユーザフレンドリーな [[コマンドラインシェル]] です。
   
  +
''fish'' は意図的に [[Wikipedia:POSIX|POSIX]] に準拠しておらず、簡略化された構文または異なる構文を使用して POSIX の矛盾に対処することを目的としています。これは、単純な POSIX 準拠のスクリプトであっても、fish で実行するにはかなりの適応や完全な書き換えが必要になる可能性があることを意味します。
 
== インストール ==
 
== インストール ==
   
 
{{Pkg|fish}} パッケージを[[pacman|インストール]]してください。開発版は {{AUR|fish-git}} パッケージでインストールできます。
 
{{Pkg|fish}} パッケージを[[pacman|インストール]]してください。開発版は {{AUR|fish-git}} パッケージでインストールできます。
 
fish をデフォルトシェルにしたい場合は、[[シェル#デフォルトシェルを変更する]]を見てください。ただし、[[#fish をデフォルトシェルに設定しない|fish はデフォルトシェルにしない]]ことを推奨します。
 
   
 
インストールしたら {{ic|fish}} を実行することで fish シェルが起動します。
 
インストールしたら {{ic|fish}} を実行することで fish シェルが起動します。
17行目: 19行目:
 
ドキュメントは 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}} にあるすべてのファイルを適切に source するようになります。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 に知らせるには、{{ic|~/.bashrc}} でログインシェルのステータスを検出し、{{ic|-login}} オプションを fish に渡します。fish のシェルコマンド {{ic|status}} を使えば、ステータスを表示することもできます。
  +
* 親プロセスが fish でない場合のみ、fish にドロップインします。これにより、{{ic|bash}} の設定を失うことなく、{{ic|~/.bashrc}} コマンドを実行することで bash に素早く入ることができます。
  +
{{bc|<nowiki>if [[ $(ps --no-header --pid=$PPID --format=comm) != "fish" && -z ${BASH_EXECUTION_STRING} ]]
  +
then
  +
shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION=''
  +
exec fish $LOGIN_OPTION
  +
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 にドロップされます。
   
 
== 設定 ==
 
== 設定 ==
  +
fish のユーザー設定ファイルは {{ic|~/.config/fish/config.fish}} に存在しています。{{ic|.bashrc}} と同じように、ターミナルが開かれる時に実行/定義するコマンド、関数を追加します。
 
  +
設定ファイルはログインごとに実行され、{{ic|~/.config/fish/config.fish}} にあります。ファイルにコマンドまたは関数を追加すると、{{ic|.bashrc}} と同様に、ターミナルを開いたときにそれらが実行/定義されます。変数を保存する必要がある場合は、前述の設定ファイルで定義するのではなく、変数を ''ユニバーサル'' として設定する必要があることに注意してください。
  +
  +
ユーザーの関数は、ディレクトリ {{ic|~/.config/fish/functions}} のファイル名 {{ic|''function_name''.fish}} にあります。
   
 
=== ウェブインターフェイス ===
 
=== ウェブインターフェイス ===
95行目: 104行目:
 
==ヒントとテクニック‎==
 
==ヒントとテクニック‎==
   
  +
=== コマンド置換 ===
=== fish をデフォルトシェルに設定しない ===
 
   
  +
''fish'' は Bash スタイルの履歴置換 (例:{{ic|sudo !!}}) を実装していません。開発者は [https://fishshell.com/docs/current/faq.html#why-doesn-t-history-substitution-etc-work fish faq] で、代わりにインタラクティブな履歴呼び出しインターフェースを使用するよう推奨しています: {{ic|Up}} 矢印は過去の行全体を呼び出し、{{ic|Alt+Up}} は個々の引数を呼び出します。(または {{ic|Alt+.}}) は個々の引数を呼び出し、{{ic|Alt+s}} は既存の行の前に {{ic|sudo}} を追加します。
Arch ではシェルスクリプトは [[Bash]] を使って書かれており、fish と完全な互換性がありません。fish をデフォルトシェルに設定しないことで、起動時に実行される Bash スクリプトで環境変数を正しく設定できます。また、fish などの Bash 非互換のターミナルを使った場合に起こる問題を避けられます。デフォルトシェルを fish に設定するとスクリプトエラーが発生します。以下では fish をデフォルトシェルに設定しないで使用する方法を説明しています。
 
   
  +
しかし、いくつかの回避策が [https://github.com/fish-shell/fish-shell/wiki/Bash-Style-Command-Substitution-and-Chaining-(!!-!$) fish wiki] に記述されています。完全な履歴置換はできませんが、いくつかの関数は {{ic|!!!}} を直前のコマンドに、{{ic|!$}} を直前の最終引数に置き換えます。
==== .bashrc から fish を起動する ====
 
   
  +
=== グリーティングを無効化 ===
デフォルトシェルを Bash のままにしておいて {{ic|exec fish}} という行を[[Bash#設定ファイル|シェルの設定ファイル]] (例: {{ic|.bashrc}}) に追加してください。これで Bash が {{ic|/etc/profile}} や {{ic|/etc/profile.d}} のファイルを正しく読み込んでくれます。''fish'' は bash のプロセスを置き換えるため、''fish'' を終了するとターミナルも終了します。ローカルマシンだけでなく SSH サーバーでも使える方法のため、以下で説明する方法よりも汎用的です。
 
   
  +
デフォルトでは、fish は起動時にグリーティングメッセージを表示します。無効にするには、次のコマンドを 1 回実行します:
{{Tip|上記のように設定する場合、{{ic|bash --norc}} を使うことで {{ic|~/.bashrc}} に書かれているコマンドを実行することなく Bash を開くことができます。普通に Bash を起動すると即座に Fish に戻ってしまいます。}}
 
   
  +
$ set -U fish_greeting
==== ターミナルエミュレータのオプションを使用する ====
 
   
  +
これにより、すべての Fish インスタンスと共有され、シェルの再起動時に保存されるユニバーサル変数 {{ic|fish_greeting}} がクリアされます。
fish を起動するコマンドラインオプションを使用してターミナルエミュレータを開くという方法もあります。大抵のターミナルでは {{ic|-e}} スイッチを使います。例えば fish を使用して gnome-terminal を開くには、ショートカットを以下のように変更してください:
 
 
gnome-terminal -e fish
 
 
シェルの設定をサポートしていない LilyTerm などの軽量ターミナルエミュレータでは以下のように設定してください:
 
 
SHELL=/usr/bin/fish lilyterm
 
 
ターミナルの設定からターミナルのデフォルトシェルを fish に設定できたり、ターミナルエミュレータにプロファイル機能がある場合、ターミナルプロファイルで設定できることがあります。
 
 
どちらにしてもターミナルエミュレータを開いたら、fish が起動するようになります。
 
 
==== ターミナルマルチプレクサのオプションを使用する ====
 
 
[[tmux]] で起動するシェルを fish に設定するには、以下を {{ic|~/.tmux.conf}} に記述してください:
 
 
set-option -g default-shell "/usr/bin/fish"
 
 
''tmux'' を起動すると fish が立ち上がるようになります。
 
 
=== fish をデフォルトシェルに設定する ===
 
 
fish をデフォルトシェルとして設定した場合、パスが正しく設定されていないことに気づくでしょう。{{ic|~/.config/fish/config.fish}} ファイルにセクションを追加してログイン時にパスを適切に設定することができます。ログインシェルの場合だけ実行される {{ic|.profile}} や {{ic|.bash_profile}} と同じです。
 
 
{{bc|
 
if status --is-login
 
set PATH $PATH /usr/bin /sbin
 
end
 
}}
 
 
{{Note|{{ic|$MOZ_PLUGIN_PATH}} など、他の環境変数も手動で追加する必要があります。fish をデフォルトシェルとしてシームレスに使えるようにするには骨が折れる作業量になります。[[#fish をデフォルトシェルに設定しない|fish をデフォルトシェルに設定しない]]方が簡単です。}}
 
 
=== グリーティングを無効化 ===
 
 
デフォルトでは、fish は起動時にグリーティングメッセージを表示します。無効にするには、fish の設定ファイルに {{ic|set fish_greeting}} と追加してください。
 
   
 
=== su で fish を起動する ===
 
=== su で fish を起動する ===
   
''su'' Bash が起動する場合、fish の設定ファイに以下の関数を定義ます:
+
''su'' Bash で始まる場合、Bash がターゲットユーザー (ユーザー名が指されていない場合は ''root'' ) のデトシェルですが、ユーザーシェルに関係なく fish にリダイレクトする関数を定義することもできます:
   
  +
{{hc|~/.config/fish/functions/su.fish|2=
function su
 
  +
function su
/bin/su --shell=/usr/bin/fish $argv
 
  +
command su --shell=/usr/bin/fish $argv
end
 
  +
end}}
   
 
=== ログイン時に X を起動 ===
 
=== ログイン時に X を起動 ===
163行目: 139行目:
 
end
 
end
 
</nowiki>}}
 
</nowiki>}}
 
=== liquidprompt を使う ===
 
 
[https://github.com/nojhan/liquidprompt Liquidprompt] は Bash と Zsh 用に作られたフル機能の人気のあるアダプティブプロンプトですが fish に対応する予定はありません [https://github.com/nojhan/liquidprompt/pull/230]。[https://github.com/wesbarnett/fish-lp fish-lp プロジェクト] は fish で Liquidprompt を実装しています。
 
   
 
=== プロンプトに git の状態を表示する ===
 
=== プロンプトに git の状態を表示する ===
   
カレントディレクトリが git ディレクトリの場合 fish ブランチなどの状態を表示するには、以下 {{ic|~/.config/fish/config.fish}} に追加しま:
+
git ディレクトリにいるときに、fish ブランチやダーティの状態を表示させたい場合は、以下 {{ic|fish_prompt}} 関数を定義るとよいでしょう。
{{bc|<nowiki>
 
# 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
 
   
  +
{{hc|~/.config/fish/functions/fish_prompt.fish|
# 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
 
function fish_prompt
set last_status $status
+
set -l last_status $status
  +
set_color $fish_color_cwd
 
  +
if not set -q __fish_git_prompt_show_informative_status
printf '%s' (prompt_pwd)
 
  +
set -g __fish_git_prompt_show_informative_status 1
set_color normal
 
  +
end
printf '%s ' (__fish_git_prompt)
 
  +
if not set -q __fish_git_prompt_color_branch
set_color normal
 
  +
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
 
end
  +
}}
</nowiki>}}
 
  +
  +
しかし、これは現在では非推奨となっています。[https://github.com/fish-shell/fish-shell/blob/master/share/functions/__fish_git_prompt.fish fish-shell git] を参照してください。代わりに、[https://mariuszs.github.io/blog/2013/informative_git_prompt.html Informative Git Prompt] が fish に組み込まれ、必要であれば fish_config から起動できるようになりました。
   
 
=== SSH のプロンプトでホスト名に色を付ける ===
 
=== SSH のプロンプトでホスト名に色を付ける ===
   
SSH 経由で接続するたびにプロンプ​​トでホスト名を動的に色付けするには、fish_prompt 関数または fish 構成ファイルのいずれかに次の行を追加します。ここでは赤色を使用しています。
+
SSH 経由で接続するたびにプロンプ​​トでホスト名を動的に色付けするには、fish_prompt 関数または fish 設定ファイルのいずれかに次の行を追加します。ここでは赤色を使用しています。
   
 
{{hc|~/.config/fish/functions/fish_prompt.fish|
 
{{hc|~/.config/fish/functions/fish_prompt.fish|
214行目: 201行目:
 
=== "command not found" フック ===
 
=== "command not found" フック ===
   
[[pkgfile]] には "command not found" フックが含まれており、認識できないコマンドを入力したきに自動的に公式リポジトリ検索されます。[[pkgfile]] をインストールすると自動的にフックが実行されるようになっています。
+
Fish には"command not found" フックがり、認識されないコマンドを入力すると自動的に公式リポジトリ検索ます。このフックは {{Pkg|pkgfile}}使用して実行され、インストールされていない場合は{{ic|pacman-F}} にフォールバックされます。
  +
  +
3.2.2 以降では、 [https://github.com/fish-shell/fish-shell/issues/7841 パフォーマンスが落ちる] ため、"command not found" はデフォルトで {{ic|pacman-F}} にフォールバックしません。
  +
  +
この動作によって生じる遅延が望ましくない場合は、エラーメッセージのみを出力するように {{ic|fish_command_not_found}} を再定義することでこのフックをオーバーライドできます。
  +
  +
$ function fish_command_not_found
  +
__fish_default_command_not_found_handler $argv[1]
  +
end
  +
  +
この変更を永続的にするには、{{ic|funcsave}} ビルトインを使用します:
  +
  +
$ funcsave fish_command_not_found
   
 
=== ジョブリストからプロセスを削除する ===
 
=== ジョブリストからプロセスを削除する ===
241行目: 240行目:
 
詳細については、 [https://fishshell.com/docs/current/cmds/alias.html alias - create a function — fish-shell]
 
詳細については、 [https://fishshell.com/docs/current/cmds/alias.html alias - create a function — fish-shell]
   
  +
=== ログイン時のソース /etc/profile ===
== トラブルシューティング ==
 
   
  +
{{ic|bash}} とは異なり、{{ic|fish}} は tty ログインで {{ic|/etc/profile}} をソースにしません。このファイルのソースを
===履歴置換===
 
  +
{{ic|/etc/profile.d}} ディレクトリに環境変数が追加され、宣言されている場合は、config に以下を追加します:
Fish は履歴置換 (例: {{ic|sudo !!}}) を実装しておらず、fish の開発者は [http://fishshell.com/docs/current/faq.html#faq-history 実装する予定もない] と発言しています。しかしながら、履歴置換は多くのユーザーにとって必要不可欠な機能です。Reddit ユーザーの [https://www.reddit.com/u/crossroads1112 crossroads1112] が履歴置換の機能を再現した関数を作成しています (ただし構文は異なっています)。関数は [https://gist.github.com/crossroads1112/77badb2c3455e23b873b github] にあり、使い方はコメントとして書いてあります。オリジナルの構文に近づけた [https://gist.github.com/b-/981892a65837ab0a387e フォークバージョン] も存在し、ヘルパー関数でコマンドを指定すれば {{ic|command !!}} が使えます。
 
  +
  +
{{hc|~/.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
  +
}}
   
  +
{{ic|bash}} ログインセッションのように、ログインシェルとして {{ic|fish}} を実行しながら、通常使用するすべての環境変数を使用できます。
{{ic|command !!}} を使用できるようにする方法は [https://github.com/fish-shell/fish-shell/wiki/Bash-Style-History-Substitution-%28%21%21-and-%21%24%29 Fish の github wiki] にもあります。{{ic|bind_bang}} 関数で {{ic|!!}} をコマンド履歴の最後のコマンドに展開する例が載っています。[https://github.com/fish-shell/fish-shell/issues/288#issuecomment-158704275 こちらの github issue] も参照してください。
 
   
 
== 参照 ==
 
== 参照 ==
253行目: 260行目:
 
* http://fishshell.com/docs/current/index.html - ドキュメント
 
* http://fishshell.com/docs/current/index.html - ドキュメント
 
* http://hyperpolyglot.org/unix-shells - シェル文法の対応表
 
* http://hyperpolyglot.org/unix-shells - シェル文法の対応表
  +
* https://github.com/fish-shell/fish-shell - fish on GitHub

2024年1月4日 (木) 17:09時点における最新版

関連記事

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

ヒント:
  • このセットアップでは、bash --norc を使用して、~/.bashrc からコマンドを実行せずに手動で Bash に入り、exec fish を実行して fish に戻ります。
  • bash -c 'echo test' のようなコマンドを fish の起動ではなく Bash で実行させるには、代わりに if [ -z "$BASH_EXECUTION_STRING" ]; then exec fish; fi と記述します。
  • ログインシェルかどうかを fish に知らせるには、~/.bashrc でログインシェルのステータスを検出し、-login オプションを fish に渡します。fish のシェルコマンド status を使えば、ステータスを表示することもできます。
  • 親プロセスが fish でない場合のみ、fish にドロップインします。これにより、bash の設定を失うことなく、~/.bashrc コマンドを実行することで bash に素早く入ることができます。
if [[ $(ps --no-header --pid=$PPID --format=comm) != "fish" && -z ${BASH_EXECUTION_STRING} ]]
then
	shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION=''
	exec fish $LOGIN_OPTION
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 にドロップされます。

設定

設定ファイルはログインごとに実行され、~/.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 が閉じられることはありません。詳しくは 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

ログイン時のソース /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 を実行しながら、通常使用するすべての環境変数を使用できます。

参照