fish のインストール
大抵のLinuxにおいてデフォルトのシェルは以下のようにbashである.
しかし,fish (friendly interactive shell) のほうが使いやすいという話を聞いたので,シェルを変えてみることにした.
カーネルとのやり取りをするシェルは毎日つかうものなので,使いやすい方がよいに決まっている.
esho $SHELL
> /bin/bash
shは、UNIX系のOSで使用できるシェルの中で最も古くから存在します。AT&Tベル研究所のスティーブン・ボーン氏によって開発されました。
...
shが開発者の名前にちなんで「Bourneシェル」と呼ばれることに対して、それを生まれ変わらせたシェルという意味の「Bourne Again Shell」の略称で、bashと名付けられています。
「sh」を筆頭に「sh」「bash」「ksh」がsh系派閥です。
「csh」を筆頭に「csh」「tcsh」がcsh系派閥です。
そして、どちらの派閥とも仲良くしたがっている「zsh」があります。
方針
以下の2つの方針を提示する
- すべてにおいてfishを使う
- bashの環境にfishをかぶせる
1. すべてにおいてfishを使う
新規環境構築ではこちらでもいいかもしれない.
ただ,bashの方がマジョリティであるため,Ubuntu関連の多くのWeb記事がbashの表記であるため,不具合の場合にSHELL由来か否かを判断する能力が必要と思われる.
特にfishはfishrcなどのファイルが存在せず,読み替えに若干の手間が必要でありPATHを通すのが面倒であるのも事実.
2. bashの環境にfishをかぶせる
PATH読み込みなどの実態はbashだが,表示はfishにする手法.
上述の問題が解決するが,見かけはfishなのに,実態はbashになるので,常に注意が必要であるという問題点がある.
HowTo
今回は2のbashを基本としつつ,fishの起動コマンドを.bashrcに書き込むことで,できるだけ既存の環境を変えず,飽きたらすぐ辞められる形式でbashの環境にfishをかぶせる.
fish Install
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)コマンド: ログインシェルを変更する -> 参考
-
$ sudo apt-add-repository ppa:fish-shell/release-3
$ sudo apt update
$ sudo apt install fish
$ 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に以下を追記する.
exec fish
URLs
- 特に改造はしていない普通のインストールガイド
- 結構コレを参考にした
-
oh-my-fish/theme-bobthefishでgitを見やすくするためにfontの話とかが載ってるが,WSLなので参考程度- Ubuntu GNOME での実装例
- aliasとか細かいところもフォローしてる
- 2015年の情報
- fisher の plugin なども記載されている
- HomebrewなのでMacでの実装か
- M1環境でこだわってるけど参考程度
- それほどカスタムはしてないけど,
.bashrcに書き込むという情報があり
- Ubuntuでの実装
- FishとFishermanについてなので詳しく載っているしフォントも変えてるが2018年
デフォルトのシェルに設定するのですが、本当に起動時からデフォルト設定にしてしまうと、今まで.bashrcなどに様々な設定を書き込んでいた場合は、その依存関係が読み込めなくなってしまいます。
そこで、bashを残しつつ、あたかもデフォルトで起動するような設定にします。
.bashrcの最終行に次の一文を追記します。
exec fishこうすることでbashを呼び出した後で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ではなくzshである.