「Fish」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎参照: リンクを追加)
 
(同じ利用者による、間の7版が非表示)
5行目: 5行目:
 
[[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 シェルが起動します。
40行目: 42行目:
 
fish をシステム全体またはユーザーのデフォルトとして設定しないと、起動時に現在の Bash スクリプトを実行できます。これにより、現在のユーザーの環境変数が変更されず、Bash の子として実行される fish にエクスポートされます。以下は、fish をデフォルトのシェルとして設定せずにインタラクティブシェルモードで実行するいくつかの方法です。
 
fish をシステム全体またはユーザーのデフォルトとして設定しないと、起動時に現在の Bash スクリプトを実行できます。これにより、現在のユーザーの環境変数が変更されず、Bash の子として実行される fish にエクスポートされます。以下は、fish をデフォルトのシェルとして設定せずにインタラクティブシェルモードで実行するいくつかの方法です。
   
==== .bashrc を変更して fish にドロップするようにします ====
+
==== .bashrc を変更して fish にドロップする ====
   
デフォルトのシェルを Bash にして、 {{ic|exec fish}} という行を {{ic|.bashrc}} などの適切な [[Bash#設定ファイル]] に追加するだけでよいのです。これにより、Bash は {{ic|/etc/profile}} と {{ic|/etc/profile.d}} にあるすべてのファイルを適切にソースするようになります。fish は Bash のプロセスを置き換えるので、fish を終了すると端末も終了します。以下のオプションと比較すると、これはローカルマシンでも SSH サーバでも動作するため、最も普遍的な解決策と言えます。
+
デフォルトのシェルを Bash にして、{{ic|exec fish}} という行を {{ic|.bashrc}} などの適切な [[Bash#設定ファイル]] に追加するだけです。これにより、Bash は {{ic|/etc/profile}} と {{ic|/etc/profile.d}} にあるすべてのファイルを適切に source するようになります。fish は Bash のプロセスを置き換えるので、fish を終了すると端末も終了します。以下のオプションと比較すると、これはローカルマシンでも SSH サーバでも動作するため、最も普遍的な解決策と言えます。
   
 
{{Tip|
 
{{Tip|
 
* このセットアップでは、{{ic|bash --norc}} を使用して、{{ic|~/.bashrc}} からコマンドを実行せずに手動で Bash に入り、{{ic|exec fish}} を実行して fish に戻ります。
 
* このセットアップでは、{{ic|bash --norc}} を使用して、{{ic|~/.bashrc}} からコマンドを実行せずに手動で Bash に入り、{{ic|exec fish}} を実行して fish に戻ります。
* {{ic|bash -c 'echo test'}} のようなコマンドを fish の起動ではなくBashで実行させるには、代わりに {{ic|if [ -z "$BASH_EXECUTION_STRING" ]; then exec fish; fi}} と記述します。
+
* {{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 に素早く入ることができます。
 
* 親プロセスが fish でない場合のみ、fish にドロップインします。これにより、{{ic|bash}} の設定を失うことなく、{{ic|~/.bashrc}} コマンドを実行することで bash に素早く入ることができます。
 
{{bc|<nowiki>if [[ $(ps --no-header --pid=$PPID --format=comm) != "fish" && -z ${BASH_EXECUTION_STRING} ]]
 
{{bc|<nowiki>if [[ $(ps --no-header --pid=$PPID --format=comm) != "fish" && -z ${BASH_EXECUTION_STRING} ]]
 
then
 
then
  +
shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION=''
exec fish
 
  +
exec fish $LOGIN_OPTION
 
fi</nowiki>}}
 
fi</nowiki>}}
 
}}
 
}}
75行目: 79行目:
   
 
== 設定 ==
 
== 設定 ==
  +
fish のユーザー設定ファイルは {{ic|~/.config/fish/config.fish}} に存在しています。{{ic|.bashrc}} と同じように、ターミナルが開かれる時に実行/定義するコマンド、関数を追加します。
 
  +
設定ファイルはログインごとに実行され、{{ic|~/.config/fish/config.fish}} にあります。ファイルにコマンドまたは関数を追加すると、{{ic|.bashrc}} と同様に、ターミナルを開いたときにそれらが実行/定義されます。変数を保存する必要がある場合は、前述の設定ファイルで定義するのではなく、変数を ''ユニバーサル'' として設定する必要があることに注意してください。
  +
  +
ユーザーの関数は、ディレクトリ {{ic|~/.config/fish/functions}} のファイル名 {{ic|''function_name''.fish}} にあります。
   
 
=== ウェブインターフェイス ===
 
=== ウェブインターフェイス ===
105行目: 112行目:
 
=== グリーティングを無効化 ===
 
=== グリーティングを無効化 ===
   
デフォルトでは、fish は起動時にグリーティングメッセージを表示します。無効にするには、fish 設定ファイルに {{ic|set fish_greeting}} と追加てください。
+
デフォルトでは、fish は起動時にグリーティングメッセージを表示します。無効にするには、コマンドを 1 回実行ます:
  +
  +
$ set -U fish_greeting
  +
  +
これにより、すべての Fish インスタンスと共有され、シェルの再起動時に保存されるユニバーサル変数 {{ic|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 を起動 ===
189行目: 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
   
 
=== ジョブリストからプロセスを削除する ===
 
=== ジョブリストからプロセスを削除する ===
215行目: 239行目:
   
 
詳細については、 [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 に以下を追加します:
  +
  +
{{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}} を実行しながら、通常使用するすべての環境変数を使用できます。
   
 
== 参照 ==
 
== 参照 ==

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 を実行しながら、通常使用するすべての環境変数を使用できます。

参照