「Fish」の版間の差分
(未訳部分の翻訳) |
(→.bashrc を変更して fish にドロップするようにします: 情報を更新) |
||
(4人の利用者による、間の21版が非表示) | |||
1行目: | 1行目: | ||
{{lowercase title}} |
{{lowercase title}} |
||
− | [[Category:コマンドシェル]] |
+ | [[Category:コマンドラインシェル]] |
[[de:Fish]] |
[[de:Fish]] |
||
[[en:Fish]] |
[[en:Fish]] |
||
[[ru:Fish]] |
[[ru:Fish]] |
||
+ | [[zh-hans:Fish]] |
||
− | '''fish''' ('''friendly interactive shell''') は主に対話的に使用することを意図されたユーザフレンドリーなコマンドラインシェルです。 |
||
+ | {{Related articles start}} |
||
+ | {{Related|コマンドラインシェル}} |
||
+ | {{Related articles end}} |
||
+ | '''fish''' ('''friendly interactive shell''') は主に対話的に使用することを意図されたユーザフレンドリーな [[コマンドラインシェル]] です。 |
||
+ | ''fish'' は意図的に [[Wikipedia:POSIX|POSIX]] に準拠しておらず、簡略化された構文または異なる構文を使用して POSIX の矛盾に対処することを目的としています。これは、単純な POSIX 準拠のスクリプトであっても、fish で実行するにはかなりの適応や完全な書き換えが必要になる可能性があることを意味します。 |
||
== インストール == |
== インストール == |
||
− | + | {{Pkg|fish}} パッケージを[[pacman|インストール]]してください。開発版は {{AUR|fish-git}} パッケージでインストールできます。 |
|
+ | インストールしたら {{ic|fish}} を実行することで fish シェルが起動します。 |
||
− | 最新の開発版は [[AUR]] より {{AUR|fish-shell-git}}{{Broken package link|{{aur-mirror|fish-shell-git}}}} を[[pacman|インストール]]します。 |
||
+ | ドキュメントは fish から {{ic|help}} を実行することでウェブブラウザが開いて確認できます。fish の構文は他のシェルと異なっているので、最低でも "Syntax overview" セクションを読むことを推奨します。 |
||
− | 2011年に [https://github.com/liljencrantz オリジナルの開発者] による [http://www.mail-archive.com/fish-users@lists.sourceforge.net/msg02893.html 開発が中止された] 従来のバージョンは [[AUR]] より {{AUR|fish-git}} を[[pacman|インストール]]します。 |
||
+ | == システムへの統合 == |
||
− | fish をデフォルトシェルにするには、{{ic|chsh -s /usr/bin/fish}} を実行します。 |
||
+ | fish をデフォルトのユーザーシェルとするのか、つまりログイン時に直接 fish に入るのか、それとも現在のデフォルトシェルの子プロセスとしてインタラクティブシェルモードで使用するのか、ここでは後者を [[Bash]] と仮定しています。この2つの設定について詳しく説明します。 |
||
− | == 入出力 == |
||
+ | * '''デフォルトシェル''' として使用される fish: このモードでは、fish の機能とそのスクリプト言語に関する基本的な理解が必要です。ユーザーの現在の初期化スクリプトと環境変数を新しい fish 環境に移行する必要があります。このモードでシステムを設定するには、[[fish#fish をデフォルトのシェルとして設定する|fish をデフォルトのシェルとして設定する]] に従ってください。 |
||
− | === ファイル記述子 === |
||
+ | * '''インタラクティブシェルオンリー''': このモードでは、Bash の初期化スクリプトは通常通り実行され、fish はターミナルに接続された対話型モードで Bash の上で実行されるため、混乱が少ないモードです。このモードで fish を設定するには、[[fish#fish をインタラクティブシェルとして設定する|fish をインタラクティブシェルとして設定する]] に従ってください。 |
||
− | 他のシェルと同じように、入出力ストリームをリダイレクトすることが fish でも出来ます。テキストファイルを使ってプログラムのエラー出力を保存したり、テキストファイルを入力したりする場合に有用です。ほとんどのプログラムは3つの入出力ストリームを使います。ファイル記述子 (FD) と呼ばれる番号で表されます: |
||
+ | === fish をデフォルトのシェルとして設定する === |
||
− | * 標準入力 (FD 0) は読み取りに使われます (デフォルトではキーボード)。 |
||
− | * 標準出力 (FD 1) は書き込みに使われます (デフォルトではスクリーン)。 |
||
− | * 標準エラー (FD 2) はエラーや警告の表示に使われます (デフォルトではスクリーン)。 |
||
+ | fish をデフォルトのユーザーシェルとして設定することに決めた場合、最初のステップは、この特定のユーザーのシェルを {{ic|/usr/bin/fish}} に設定することです。これは、[[コマンドラインシェル#デフォルトシェルを変更する]] の説明に従って行うことができます。 |
||
− | === リダイレクト === |
||
− | リダイレクトという仕組みを使うことでファイル記述子の出力先を他のファイルに変えることができます: |
||
+ | 次のステップは、様々な Bash の初期化スクリプト、すなわち {{ic|/etc/profile}}, {{ic|~/.bash_profile}}, {{ic|/etc/bash.bashrc}}, {{ic|~/.bashrc}} で行われる現在必要な動作と設定を、fish フレームワークに移植するものです。 |
||
− | {{bc|''標準入力をリダイレクト:'' |
||
− | $ command < source_file |
||
+ | 特に、環境変数 {{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 をインタラクティブシェルとして設定する === |
||
− | ''既存のファイルに標準エラーを追記:'' |
||
− | $ command ^^ destination}} |
||
+ | fish をシステム全体またはユーザーのデフォルトとして設定しないと、起動時に現在の Bash スクリプトを実行できます。これにより、現在のユーザーの環境変数が変更されず、Bash の子として実行される fish にエクスポートされます。以下は、fish をデフォルトのシェルとして設定せずにインタラクティブシェルモードで実行するいくつかの方法です。 |
||
− | {{ic|destination}} には以下のどれかを使えます: |
||
+ | ==== .bashrc を変更して fish にドロップする ==== |
||
− | * ファイル名 (出力は指定されたファイルに書き込まれます)。 |
||
− | * {{ic|&}} と他のファイル記述子の番号。出力は他のファイル記述子に書き込まれます。 |
||
− | * {{ic|&}} と {{ic|-}} 記号。出力はどこにも書き込まれません。 |
||
+ | デフォルトのシェルを Bash にして、{{ic|exec fish}} という行を {{ic|.bashrc}} などの適切な [[Bash#設定ファイル]] に追加するだけです。これにより、Bash は {{ic|/etc/profile}} と {{ic|/etc/profile.d}} にあるすべてのファイルを適切に source するようになります。fish は Bash のプロセスを置き換えるので、fish を終了すると端末も終了します。以下のオプションと比較すると、これはローカルマシンでも SSH サーバでも動作するため、最も普遍的な解決策と言えます。 |
||
− | 例: |
||
− | {{bc|''標準出力をファイルにリダイレクト:'' |
||
− | $ command > destination_file.txt |
||
+ | {{Tip| |
||
− | ''標準出力と標準出力の両方を同じファイルにリダイレクト:'' |
||
+ | * このセットアップでは、{{ic|bash --norc}} を使用して、{{ic|~/.bashrc}} からコマンドを実行せずに手動で Bash に入り、{{ic|exec fish}} を実行して fish に戻ります。 |
||
− | $ command > destination_file.txt ^ &1 |
||
+ | * {{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>}} |
||
+ | }} |
||
+ | ==== ターミナルエミュレータでオプションを使用する ==== |
||
− | ''標準出力を消す:'' |
||
− | $ command > &-}} |
||
+ | もうひとつの方法は、fish を実行するコマンドラインオプションを指定してターミナルエミュレータを開くことです。ほとんどのターミナルでは、これは {{ic|-e}} スイッチなので、たとえば fish を使って gnome-terminal を開くには、ショートカットを変更してください。 |
||
− | === パイプ === |
||
+ | gnome-terminal -e fish |
||
− | あるコマンドの標準出力を次のコマンドの標準入力にリダイレクトすることができます。パイプ文字 ({{ic|<nowiki>|</nowiki>}}) を使ってコマンドを区切って下さい。例: |
||
+ | {{aur|lilyterm-git}} など、シェルの設定をサポートしていない端末エミュレーターでは、次のようになります。 |
||
− | cat example.txt | head |
||
+ | SHELL=/usr/bin/fish lilyterm |
||
− | (標準出力だけでなく) 他のファイル記述子をパイプにリダイレクトすることもできます。次の例では、標準エラーのファイル記述子の番号と {{ic|>}} をパイプに付けることで、あるコマンドの標準エラーを他のコマンドの標準入力に流し込んでいます: |
||
+ | また、ターミナルによっては、ターミナル設定またはターミナルプロファイルで fish をデフォルトのシェルとして設定できる場合があります。 |
||
− | $ command 2>| 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}} にあります。 |
||
=== ウェブインターフェイス === |
=== ウェブインターフェイス === |
||
81行目: | 91行目: | ||
選択した設定は、個人用の設定ファイルに書き込まれます。また、定義された関数と履歴を表示することができます。 |
選択した設定は、個人用の設定ファイルに書き込まれます。また、定義された関数と履歴を表示することができます。 |
||
− | |||
− | === プロンプト === |
||
− | |||
− | git ディレクトリにいるときにブランチやダーティな状態を fish に表示してほしい場合、以下を {{ic|~/.config/fish/config.fish}} に追加します: |
||
− | {{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 |
||
− | |||
− | # 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 |
||
− | </nowiki>}} |
||
=== コマンド補完 === |
=== コマンド補完 === |
||
119行目: | 102行目: | ||
fish の開発元のポリシーが、上流の tarball に存在する補完を全て含めるというものなので ''pacman'', ''pacman-key'', ''makepkg'', ''cower'', ''pbget'', ''pacmatic'' などの Arch Linux 固有のコマンドの文脈に沿った補完も fish に含まれています。メモリ管理が賢いために、リソースに悪影響を与えることはありません。 |
fish の開発元のポリシーが、上流の tarball に存在する補完を全て含めるというものなので ''pacman'', ''pacman-key'', ''makepkg'', ''cower'', ''pbget'', ''pacmatic'' などの Arch Linux 固有のコマンドの文脈に沿った補完も fish に含まれています。メモリ管理が賢いために、リソースに悪影響を与えることはありません。 |
||
+ | ==ヒントとテクニック== |
||
− | === /etc/profile と ~/.profile の互換性 === |
||
+ | === コマンド置換 === |
||
− | POSIX 標準の {{ic|sh}} の構文は fish と互換性がないため、fish では {{ic|/etc/profile}} (そして {{ic|/etc/profile.d}} の {{ic|*.sh}} ファイル) や {{ic|~/.profile}} を source することはできません。 |
||
+ | ''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}} を追加します。 |
||
− | これらのファイルを fish で source したい場合、[[dash]] をインストールして以下の行を {{ic|config.fish}} に追加してください: |
||
− | env -i HOME=$HOME dash -l -c printenv | sed -e '/PATH/s/:/ /g;s/=/ /;s/^/set -x /' | source |
||
+ | しかし、いくつかの回避策が [https://github.com/fish-shell/fish-shell/wiki/Bash-Style-Command-Substitution-and-Chaining-(!!-!$) fish wiki] に記述されています。完全な履歴置換はできませんが、いくつかの関数は {{ic|!!!}} を直前のコマンドに、{{ic|!$}} を直前の最終引数に置き換えます。 |
||
− | 組み込まれているコマンドを使うことで実行ファイルの呼び出しを省くこともできます: |
||
− | 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 は履歴置換 (例: {{ic|sudo !!}}) を実装しておらず、fish の開発者は [http://fishshell.com/docs/current/faq.html#faq-history 実装する予定もない] と発言しています。しかしながら、履歴置換は多くのユーザーにとって必要不可欠な機能です。Reddit ユーザーの [http://www.reddit.com/u/crossroads1112 crossroads1112] が履歴置換の機能を再現した関数を作成しています (ただし構文は異なっています)。関数は [https://gist.github.com/crossroads1112/77badb2c3455e23b873b github] にあり、使い方はコメントとして書いてあります。オリジナルの構文に近づけた [https://gist.github.com/b-/981892a65837ab0a387e フォークバージョン] も存在し、ヘルパー関数でコマンドを指定すれば {{ic|command !!}} が使えます。 |
||
+ | デフォルトでは、fish は起動時にグリーティングメッセージを表示します。無効にするには、次のコマンドを 1 回実行します: |
||
− | == トラブルシューティング == |
||
+ | $ set -U fish_greeting |
||
− | Arch では、シェルスクリプトの多くは Bash 向けに書かれており、fish に翻訳されていません。そのため、fish をデフォルトシェルに設定しないほうが得策です。fish を実行するコマンドラインオプションを指定してターミナルエミュレータを開くのが一番良いと思われます。ほとんどのターミナルでは {{ic|-e}} スイッチを使います。例えば、fish で gnome-terminal を開きたいときは、使用するショートカットを以下のように変更してください: |
||
+ | これにより、すべての Fish インスタンスと共有され、シェルの再起動時に保存されるユニバーサル変数 {{ic|fish_greeting}} がクリアされます。 |
||
− | gnome-terminal -e fish |
||
+ | === su で fish を起動する === |
||
− | LilyTerm などシェルの設定をサポートしていない軽量なターミナルエミュレータでは以下のようにします: |
||
+ | ''su'' が Bash で始まる場合、Bash がターゲットユーザー (ユーザー名が指定されていない場合は ''root'' ) のデフォルトシェルですが、ユーザーのシェルに関係なく fish にリダイレクトする関数を定義することもできます: |
||
− | SHELL=/usr/bin/fish lilyterm |
||
+ | {{hc|~/.config/fish/functions/su.fish|2= |
||
− | ターミナルの設定や (ターミナルエミュレータにプロファイル機能がある場合) ターミナルのプロファイルに、ターミナルのデフォルトシェルとして fish を設定する方法もあります。ユーザーのデフォルトシェルを変更することで上記の問題が発生するのとは対照的な設定方法です。 |
||
+ | function su |
||
+ | command su --shell=/usr/bin/fish $argv |
||
+ | end}} |
||
+ | === ログイン時に X を起動 === |
||
− | tmux で起動するシェルとして fish を設定するには、{{ic|~/.tmux.conf}} に以下を記述: |
||
+ | 以下を {{ic|~/.config/fish/config.fish}} の最後に追加してください: |
||
− | set-option -g default-shell "/usr/bin/fish" |
||
+ | {{bc|1=<nowiki> |
||
− | システム全体のデフォルトシェルとして fish を設定しないことで、起動時に arch スクリプトを動作させることができ、環境変数は正しく設定され、その他、fish などの Bash と互換性がないターミナルを使用することによる問題を少なくすることが可能です。 |
||
+ | # Start X at login |
||
+ | if status --is-login |
||
+ | if test -z "$DISPLAY" -a $XDG_VTNR = 1 |
||
+ | exec startx -- -keeptty |
||
+ | end |
||
+ | end |
||
+ | </nowiki>}} |
||
+ | === プロンプトに git の状態を表示する === |
||
− | fish をデフォルトシェルとして設定した場合、パスが正しく設定されていないことに気づくでしょう。{{ic|~/.config/fish/config.fish}} にセクションを追加してログイン時にパスを適切に設定することができます。ログインシェルの場合だけ実行される {{ic|.profile}} や {{ic|.bash_profile}} と同じです。 |
||
+ | git ディレクトリにいるときに、fish にブランチやダーティの状態を表示させたい場合は、以下の {{ic|fish_prompt}} 関数を定義するとよいでしょう。 |
||
− | {{bc| |
||
+ | |||
− | if status --is-login |
||
+ | {{hc|~/.config/fish/functions/fish_prompt.fish| |
||
− | set PATH $PATH /usr/bin /sbin |
||
+ | 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 |
end |
||
}} |
}} |
||
+ | しかし、これは現在では非推奨となっています。[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 から起動できるようになりました。 |
||
− | {{ic|$MOZ_PLUGIN_PATH}} など、他の環境変数も手動で追加する必要があります。fish をデフォルトシェルとしてシームレスに使えるようにするには骨が折れる作業量になります。 |
||
− | === |
+ | === SSH のプロンプトでホスト名に色を付ける === |
+ | SSH 経由で接続するたびにプロンプトでホスト名を動的に色付けするには、fish_prompt 関数または fish 設定ファイルのいずれかに次の行を追加します。ここでは赤色を使用しています。 |
||
− | su で bash が起動する場合 (Bash がデフォルトシェルのため)、fish に関数を定義してください: |
||
+ | {{hc|~/.config/fish/functions/fish_prompt.fish| |
||
− | $ funced su |
||
+ | ... |
||
− | function su |
||
+ | if set -q SSH_TTY |
||
− | /bin/su --shell=/usr/bin/fish $argv |
||
+ | set -g fish_color_host brred |
||
+ | end |
||
+ | ...}} |
||
+ | |||
+ | === ssh-agent の評価 === |
||
+ | |||
+ | fish では適切な変数が設定されていないため {{ic|eval (ssh-agent)}} を実行するとエラーが生成されます。この問題を解決するには、csh 風のオプションである {{ic|-c}} を使ってください: |
||
+ | |||
+ | $ eval (ssh-agent -c) |
||
+ | |||
+ | === "command not found" フック === |
||
+ | |||
+ | 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 |
||
+ | |||
+ | === ジョブリストからプロセスを削除する === |
||
+ | |||
+ | fish を終了するとバックグラウンドで実行されているジョブは全て ''fish'' によって終了されます。fish の終了後もジョブを実行し続けるには {{ic|disown}} を使ってください。例えば、以下のコマンドは {{ic|firefox}} をバックグラウンドで起動してからプロセスとの関係を断ち切ります: |
||
+ | |||
+ | $ firefox & |
||
+ | $ disown |
||
+ | |||
+ | fish のプロセスが終了しても firefox が閉じられることはありません。詳しくは ''fish'' で {{man|1|disown|url=}} の [[man ページ]]を見てください。 |
||
+ | |||
+ | === 一時的なエイリアスを永続化する === |
||
+ | |||
+ | fish シェルを開いて以下のようにコマンドを実行することで簡単に永続的なエイリアスを作成することができます。 |
||
+ | $ alias lsl "ls -l" |
||
+ | $ funcsave lsl |
||
+ | fish バージョン3.0 以降では、エイリアス --save(-s) オプションをサポートしています。 |
||
+ | $ alias -s lsl "ls-l" |
||
+ | |||
+ | これは関数を作成します。 |
||
+ | function lsl |
||
+ | ls -l $argv |
||
end |
end |
||
+ | fish のシェル関数としてエイリアスが設定されます。シェル関数を確認・編集したい場合、{{ic|fish_config}} を使って作成されるウェブ設定ページの '''Function''' ページから全ての関数を閲覧できます。 |
||
− | $ funcsave su |
||
+ | 詳細については、 [https://fishshell.com/docs/current/cmds/alias.html alias - create a function — fish-shell] |
||
− | === ログイン時に X を起動 === |
||
+ | === ログイン時のソース /etc/profile === |
||
− | {{ic|~/.config/fish/config.fish}} の一番下に以下を追加します: |
||
+ | {{ic|bash}} とは異なり、{{ic|fish}} は tty ログインで {{ic|/etc/profile}} をソースにしません。このファイルのソースを |
||
− | {{bc|1=<nowiki> |
||
+ | {{ic|/etc/profile.d}} ディレクトリに環境変数が追加され、宣言されている場合は、config に以下を追加します: |
||
− | # start X at login |
||
+ | |||
− | if status --is-login |
||
+ | {{hc|~/.config/fish/config.fish| |
||
− | if test -z "$DISPLAY" -a $XDG_VTNR -eq 1 |
||
+ | # source /etc/profile with bash |
||
− | exec startx -- -keeptty |
||
+ | if status is-login |
||
− | end |
||
+ | exec bash -c "test -e /etc/profile && source /etc/profile;\ |
||
+ | exec fish" |
||
end |
end |
||
+ | }} |
||
− | </nowiki>}} |
||
+ | {{ic|bash}} ログインセッションのように、ログインシェルとして {{ic|fish}} を実行しながら、通常使用するすべての環境変数を使用できます。 |
||
− | {{Note|fish 使用時に {{ic|startx}} が {{ic|-keeptty}} フラグを必要とする理由については [https://github.com/fish-shell/fish-shell/issues/1772 この記事] を参照してください。}} |
||
== 参照 == |
== 参照 == |
||
* http://fishshell.com/ - ホームページ |
* http://fishshell.com/ - ホームページ |
||
− | * http://fishshell.com/docs/ |
+ | * http://fishshell.com/docs/current/index.html - ドキュメント |
+ | * 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 サーバでも動作するため、最も普遍的な解決策と言えます。
ターミナルエミュレータでオプションを使用する
もうひとつの方法は、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