fish SetUp

# `fish` のインストール

大抵のLinuxにおいてデフォルトのシェルは以下のようにbashである．
しかし，fish (friendly interactive shell) のほうが使いやすいという話を聞いたので，シェルを変えてみることにした．

カーネルとのやり取りをするシェルは毎日つかうものなので，使いやすい方がよいに決まっている．

```shell
esho $SHELL
> /bin/bash
```

https://udemy.benesse.co.jp/development/system/shell.html

> shは、UNIX系のOSで使用できるシェルの中で最も古くから存在します。AT&Tベル研究所のスティーブン・ボーン氏によって開発されました。
> 
> ...
> 
> shが開発者の名前にちなんで「Bourneシェル」と呼ばれることに対して、それを生まれ変わらせたシェルという意味の「Bourne Again Shell」の略称で、bashと名付けられています。

https://wa3.i-3-i.info/word11219.html

> 「sh」を筆頭に「sh」「bash」「ksh」がsh系派閥です。
> 「csh」を筆頭に「csh」「tcsh」がcsh系派閥です。
> そして、どちらの派閥とも仲良くしたがっている「zsh」があります。

## 方針

以下の2つの方針を提示する

1. すべてにおいてfishを使う
2. bashの環境にfishをかぶせる

### 1. すべてにおいてfishを使う

新規環境構築ではこちらでもいいかもしれない．
ただ，bashの方がマジョリティであるため，Ubuntu関連の多くのWeb記事がbashの表記であるため，不具合の場合にSHELL由来か否かを判断する能力が必要と思われる．
特にfishはfishrcなどのファイルが存在せず，読み替えに若干の手間が必要でありPATHを通すのが面倒であるのも事実．

https://zenn.dev/estra/articles/zenn-fish-add-path-final-answer

### 2. bashの環境にfishをかぶせる

PATH読み込みなどの実態はbashだが，表示はfishにする手法．
上述の問題が解決するが，見かけはfishなのに，実態はbashになるので，常に注意が必要であるという問題点がある．

## HowTo

今回は2のbashを基本としつつ，fishの起動コマンドを.bashrcに書き込むことで，できるだけ既存の環境を変えず，飽きたらすぐ辞められる形式でbashの環境にfishをかぶせる．

### fish Install

```bash
sudo apt-add-repository ppa:fish-shell/release-3;\
sudo apt update;\
sudo apt install fish -y;\
which fish;\

chsh -s /usr/bin/fish
```

- `sudo apt-add-repository ppa:fish-shell/release-3;\`
  - fishのレポジトリを追加
- `sudo apt update;\`
  - 念のためアプデ
- `sudo apt install fish -y;\`
  - fishのインストール
- `which fish;\`
  - PATHの確認
- `chsh -s /usr/bin/fish`
  - `chsh`(ChangeShell)コマンド: ログインシェルを変更する -> [参考](https://www.ibm.com/docs/ja/aix/7.1?topic=c-chsh-command)

```bash
$ sudo apt-add-repository ppa:fish-shell/release-3
$ sudo apt update
$ sudo apt install fish
```

```bash
$ which fish
/usr/bin/fish
$ /usr/bin/fish
Welcome to fish, the friendly interactive shell
Type help for instructions on how to use fish
~> which bash
/usr/bin/bash
~> /usr/bin/bash
$
```

### Update .bashrc

上記のコードでfishのインストールと動作確認が行えたら，.bashrcに以下を追記する．

```shell
exec fish
```

## URLs

https://ledsun.hatenablog.com/entry/2021/11/08/221058
* 特に改造はしていない普通のインストールガイド

https://zenn.dev/mammon/articles/90b27354f3ed37
* 結構コレを参考にした

https://exanano.com/programming/fish-shell/
* `oh-my-fish/theme-bobthefish` でgitを見やすくするためにfontの話とかが載ってるが，WSLなので参考程度
  * Ubuntu GNOME での実装例

https://mgre.co.jp/blog/4045
* aliasとか細かいところもフォローしてる
* 2015年の情報

https://zenn.dev/sawao/articles/0b40e80d151d6a
* fisher の plugin なども記載されている
* HomebrewなのでMacでの実装か

https://zenn.dev/yumemi_inc/articles/603e9bdf1188a1
* M1環境でこだわってるけど参考程度

https://qiita.com/koji9412/items/7e2a15c330c387fc5b3b
* それほどカスタムはしてないけど，`.bashrc` に書き込むという情報があり

https://nodaki.hatenablog.com/entry/2018/09/24/213942
* Ubuntuでの実装
* FishとFishermanについてなので詳しく載っているしフォントも変えてるが2018年

https://asdf-vm.com/guide/getting-started.html#_3-install-asdf
> デフォルトのシェルに設定するのですが、本当に起動時からデフォルト設定にしてしまうと、今まで.bashrcなどに様々な設定を書き込んでいた場合は、その依存関係が読み込めなくなってしまいます。
> 
> そこで、bashを残しつつ、あたかもデフォルトで起動するような設定にします。
> 
> .bashrcの最終行に次の一文を追記します。
> 
> ```shell
> exec fish
> ```
> 
> こうすることでbashを呼び出した後でfishを呼び出すようにします。

https://wiki.archlinux.jp/index.php/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 に素早く入ることができます。
> 
> ```shell
> if [[ $(ps --no-header --pid=$PPID --format=comm) != "fish" && -z ${BASH_EXECUTION_STRING} ]]
> then
> 	exec fish
> fi
> ```

## （余談）

なお，筆者の現環境はfishではなくzshである．

https://qiita.com/Oukaria/items/6cd0706beece722cd3db