「Fish」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎ヒントとテクニック‎: ログイン時のソース /etc/profileを翻訳して追加)
213行目: 213行目:
   
 
詳細については、 [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}} を実行しながら、通常使用するすべての環境変数を使用できます。
   
 
== 参照 ==
 
== 参照 ==

2023年12月4日 (月) 00:42時点における版

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

インストール

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 にあるすべてのファイルを適切にソースするようになります。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 は Bash スタイルの履歴置換 (例:sudo !!) を実装していません。開発者は fish faq で、代わりにインタラクティブな履歴呼び出しインターフェースを使用するよう推奨しています: Up 矢印は過去の行全体を呼び出し、Alt+Up は個々の引数を呼び出します。(または Alt+.) は個々の引数を呼び出し、Alt+s は既存の行の前に sudo を追加します。

しかし、いくつかの回避策が fish wiki に記述されています。完全な履歴置換はできませんが、いくつかの関数は !!! を直前のコマンドに、!$ を直前の最終引数に置き換えます。

グリーティングを無効化

デフォルトでは、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

プロンプトに 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" フック

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

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

参照