fish

1$ brew install fish

Bash や Zsh のようなシェルの仲間です。 デフォルトでいい感じに表示してくれるので、パソコンを買い替えた場合に便利です。

ログインシェルを fish にしたい

  1. /etc/shellsfishを追記する

  2. chsh -sコマンドでデフォルトシェルを変更する

1$ which fish
2# /usr/local/bin/fish
3# /opt/homebrew/bin/fish
4$ sudo vi /etc/shells
5$ chsh -s /opt/homebrew/bin/fish

fishのパスを/etc/shellsに追記すると chsh -s できるようになります。

fishのパスは OS で異なることがあるので which fish で確認しておきます。 /etc/shellsの編集には管理者権限が必要です。 chsh -sを実行すると変更前に管理者パスワードを確認されます。

fishを設定したい

1$ fish_config

fish_configを実行すると、ブラウザが起動します。 色やプロンプトなど設定できます。

変更点を確認したい

1$ fish_delta

fishのデフォルトから変更を加えた箇所を確認できます。

プロンプトを微修正したい

1$ code ~/.config/fish/functions/fish_prompt.fish

上記のfish_configで選んだプロンプトを少しだけ修正したい場合は、fish_prompt.fishを直接編集してしまいましょう。 僕はAstronautの2段組のプロンプトを選んだのですが、作業中のディレクトリ名は省略形に変更したいです。

パスを設定したい(fish_add_path

# Homebrew
fish_add_path /usr/local/bin

# pipx
fish_add_path $HOME/.local/bin

# Rust
fish_add_path $HOME/.cargo/bin

fish_add_pathを使ってパスを追加できます。

注釈

これまでは以下の方法set -xを使った方法でよかったのですが、v3.2から非推奨になりました。

$ set -x PATH $PATH $HOME/.cargo/bin

パスを確認したい(fish_user_paths

$ echo $fish_user_paths
echo $fish_user_paths
~/.cargo/bin ~/.local/bin /usr/local/bin

$ printf '%s\n' $fish_user_paths
~/.cargo/bin
~/.local/bin
/usr/local/bin

パスはfish_user_pathsで確認できます。

変数を設定したい(set

1set 変数名 2set -l 変数名 値1 値2
3set -gx 変数名     # bash/zshのexportに相当
4set 変数名    # ""に初期化
5set -q 変数名    # 変数名が定義されているかを確認

bash / zshではexportコマンドを使って変数を定義しますが、fishではsetコマンドを使います。

setには変数のスコープを指定できるオプション(-l / --local-g / --global-u / --universal)が3種類あります。 また、変数を外部変数にするかを指定できるオプション(-x / --export-u / --unexport)があります。 外部変数にすると、別のプログラムから変数が参照できるようになります。

set -qで変数が定義されているか確認できます。 if文と組み合わせて条件分岐に使えます。

リダイレクトしたい

$ pbcopy < ~/.gitconfig
$ echo "hello" > stdout.md
$ echo "hello" 2> stderr.md
$ echo "hello" 2>&1 stdout_and_stderr.md

コマンド補完を整理したい

$ fish_update_completions
Parsing man pages and writing completions to ~/.local/share/fish/generated_completions/
  7148 / 7148 : zic.8

fish_update_completionsでコマンド補完の候補を更新できます。 有効になったコマンド補完は~/.local/share/fish/generated_completions/で確認できます。

コマンド履歴を整理したい

// 履歴の数を確認
$ wc -l ~/.local/share/fish/fish_history
   41529

// 履歴ファイルの内容を確認
$ tail -n 30 ~/.local/share/fish/fish_history
- cmd: fish_key_reader
  when: 1718746545
- cmd: bind
  when: 1718746557
- cmd: fish_update_completions
  when: 1718746615
- cmd: cd ~/.local/share/fish/
  when: 1718746873
  paths:
    - ~/.local/share/fish/
- cmd: wc -l ~/.local/share/fish/fish_history
  when: 1718747030
  paths:
    - ~/.local/share/fish/fish_history
- cmd: tail -n 30 ~/.local/share/fish/fish_history
  when: 1718747220
  paths:
    - ~/.local/share/fish/fish_history

Fishはコマンド履歴からも補完してくれます。 しかし、打ち間違えてしまったコマンドを覚えてしまっていることもあります。 そのときは履歴ファイル(~/.local/share/fish/fish_history)を直接開き、 該当するコマンド履歴を削除します。

コマンド履歴の構造は、以下のようになっていました。 不要な項目は、この構造ごと削除します。

- cmd: コマンド名
  when: 時刻(unixtime)
  paths:
    - 実行したパス

めんどくさい場合は、履歴ファイルをまるっと削除してもいいかもしれません。