Go back to zsh from fish

programming
A hero image of the article

dotfiles1って本来頻繁に弄るべきではないと思いつつ、いくらでも改善できるので時間を忘れて弄りがちですね。

昨今、「生産性」や「作業効率」、「自動化・省力化」などの単語やDXといった言葉もあらゆる場面で耳にするようになりました。 その中でもITエンジニアは、最も効率化や自動化を行って生産性を高められる職種であると思います。

プログラマの三大美徳(「怠惰」「短気」「傲慢」)にもあるように、同じ事を何度も繰り返さずに楽をするために努力する、生産性を意識することはある種プログラマにとっては必須のスキルでもあると考えます。

生産性を高めればこそ、より多くの時間を確保できるようになり、より多くのことに取り組むことができるので、スキルアップにも最適と言えます。

fishとは?

fishは、fish shellと呼ばれるシェルの一種で、 Friendly interactive shellの略称です。 普段何気なく利用しているシェルは、bashやzshなどが多いと思いますが、fishはその中でも比較的新しいシェルです。

上記の2つを意識して作られており、利用当時は設定もほぼ不要なため非常に楽に導入して利用することが可能です。

ただ一方で POSIX2非互換 という致命的な問題も抱えています。そのため、bashの際に使ってたシェルスクリプトが動かないなどの問題が発生することもあります。 私自身は、約2年ほどfishを利用しました。細かい問題はありつつ、それなりに使えるシェルだと思っていました。

なぜfishを辞めるのか

理由は幾つかありますが、大きく言えば全体を見たらそこまで効率的なシェルではないと感じたからです。

スクリプト互換性の問題は、個人的には致命的な問題でした。fishを利用していると、bashで書かれたスクリプトが動かないことが多々ありました。 会社で利用するスクリプトなどの互換性がないと、その度自分で書き換えることになりfishのシンタックスに苛つきを覚えつつも書き換えていました。

またログインシェルをfishに変えると、POSIX非互換のためか問題に頻繁に遭遇しました。

デフォルトシェルをfishに変えるなデフォルトシェルをbashからfishに変えてからrbenvの設定が通らなくなったsa-nitawaki.medium.com
デフォルトシェルをfishに変えるな

fishからzshへ

2023年のシェル事情をざっくり調べてみましたが、あまりトレンドに変化はないように感じます。気になったのは以下です。

結局POSIX非互換という部分が強く、代替シェルは選択肢にあがりませんでした。そのため、zshに戻ることにしました。

非互換という理由だけに留まらず、MacOSのデフォルトシェルがzshになったことも大きな理由です。恐らく、今後もzshはトレンドとして継続していくと思われます。

環境構築

zshのインストール

sudo apt update -y && sudo apt install zsh

そして、ログインシェルに設定します。

chsh -s /bin/zsh

zshについては各ファイルを細かく分割するとか、プラグインを利用するとか、分割後のファイルをコンパイルして読み込み速度を早くするようなアレがあるんですが、ここでは一旦省略します。

> tre -a zsh.d
zsh.d
├── .zprofile
├── .zshenv
├── .zshrc
├── README.md
└── mods
    ├── alias.zsh
    ├── core.zsh
    ├── func.zsh
    ├── history.zsh
    ├── keybind.zsh
    ├── local.zsh
    ├── plugin.zsh
    └── util.zsh

XDG Base Directory の設定

XDG Base Directory - ArchWikiwiki.archlinux.jp

明示的に以下の環境変数を設定しておきます。デフォルト準拠です。

# XDG Base Directory
export XDG_CONFIG_HOME=$HOME/.config
export XDG_CACHE_HOME=$HOME/.cache
export XDG_DATA_HOME=$HOME/.local/share

promptの設定

starshipで設定します。

curl -sS https://starship.rs/install.sh | sh

上記を実行後、設定ファイルを作成し想定するパスに配置します。

asdfの設定

各言語ランタイムについては、複数プロダクトで異なるものを利用する可能性があるため、バージョン管理が必須です。 asdfで管理するため、設定しておきます。

公式に従って以下を実行後に、 .zshrc に読み込む設定を追加します。

git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.12.0

ghqの設定

GitHub - x-motemen/ghq: Remote repository management made easyRemote repository management made easy. Contribute to x-motemen/ghq development by creating an account on GitHub.github.com
GitHub - x-motemen/ghq: Remote repository management made easy

各種リポジトリを管理するために、ghqを利用します。asdfからgoをインストール後、以下を実行します。 GHQのルートディレクトリは、HOMEにしています。go getでインストールすると、デフォルトでHOME配下にインストールされるためです。

go install github.com/x-motemen/ghq@latest

fzfの設定

fzfのリポジトリをghq配下にcloneしたあとに、ルートディレクトリへ移動して以下を実行します。 あとは全部yesで良いです。その後自分の好みの場所へパスを通す処理を移動します。

./install --xdg

ツールのインストール

使いたいコマンドのインストールを実行します。 CUIツールのコマンド系は最近rustで作られてるものが多いので、cargoを使えるようにしておくと良いでしょう。

Homebrewは好きですが、linuxbrewが嫌いなのと自宅用のPCが現在WSL2なので、aptでインストールするようにしています。

もしaptで提供されていなければ、マニュアルビルドを行います。

まとめ

dotfilesを置いておきます。

GitHub - paveg/dotfilesContribute to paveg/dotfiles development by creating an account on GitHub.github.com
GitHub - paveg/dotfiles

余談

「ログインシェルをfishに変えるな高校校歌」

私:「ログインシェルをfishに変えるな高校校歌」の歌詞を考えてください。

ChatGPT: 「ログインシェルをfishに変えるな高校校歌」の歌詞を以下に示します。 この歌詞は、ログインシェルを変更する決意と新しいシェルに向けたエキサイティングな冒険をテーマにしています。

(イントロ) ♪ ログインシェルを変える日がやってきた ♪ Fishを選んで、新しい旅が始まる

(サビ) ♪ ターミナルの扉を開けて ♪ コマンドの世界へ飛び込もう ♪ ログインシェルを変えるその日まで ♪ Fishの波に乗って、未来を迎えよう

(間奏)

(ヴァース1) ♪ 今までのシェルに感謝を捧げ ♪ 新たなシェルに歓迎される ♪ エイリアスとプロンプトの魔法 ♪ ログインシェルを変える、最高の瞬間

(サビ) ♪ ターミナルの扉を開けて ♪ コマンドの世界へ飛び込もう ♪ ログインシェルを変えるその日まで ♪ Fishの波に乗って、未来を迎えよう

(間奏)

(ヴァース2) ♪ エラーメッセージ、わかりやすく ♪ ヒストリーと補完、助けの手 ♪ ログインシェルを変えてみて ♪ 新しいシェル、友達になろう

(サビ) ♪ ターミナルの扉を開けて ♪ コマンドの世界へ飛び込もう ♪ ログインシェルを変えるその日まで ♪ Fishの波に乗って、未来を迎えよう

(アウトロ) ♪ ログインシェル、変えたその日 ♪ 新しい旅路、広がる未来 ♪ Fishの旗を掲げて歌おう ♪ ログインシェル、変える高校の歌

この歌詞は、新しいログインシェルに切り替える決意と、その冒険を称賛しています。 新しいシェルでの楽しみと学びを楽しんでください!

私: ログインシェルをfishに変えることは推奨されますか?

ChatGPT:

ログインシェルをFishに変えるかどうかは、個人の好みや特定の使用ケースに依存します。Fishは使いやすさとユーザーエクスペリエンスを重視したシェルであり、多くのユーザーにとって魅力的な選択肢となっています。しかし、変更を検討する前にいくつかの要因を考慮することが重要です。

  1. 個人の好み: シェルは個人の好みに関連することが多いです。Fishのシンプルで直感的な構文やコマンド補完が気に入るかどうか、自分に合ったシェルかどうかを検討してください。

  2. 既存のスキル: 既にBashやZshなどの他のシェルを十分に使いこなしている場合、Fishへの切り替えには学習コストがかかるかもしれません。Fishの独自の構文やコマンド体系に慣れる必要があります。

  3. システムの要件: 一部のシステムや環境では、デフォルトのログインシェルが特定のシェルであることが前提条件とされている場合があります。このような場合、変更にはシステム管理者の承認が必要かもしれません。

  4. シェルスクリプトの互換性: 既存のシェルスクリプトがある場合、それらがFishで正しく動作するかどうかを確認する必要があります。FishはPOSIX非互換性を持つため、一部のスクリプトは修正が必要かもしれません。

  5. コミュニティとサポート: シェルを選ぶ際には、そのシェルのコミュニティとサポートも考慮すべきです。Fishには熱心なコミュニティが存在し、ドキュメンテーションも充実しています。

最終的に、ログインシェルをFishに変えるかどうかは、個人のニーズと好みに依存します。試しにFishを使ってみて、自分に合うかどうかを確かめてみることが良いアプローチかもしれません。また、必要に応じて既存のシェルとFishを併用することも可能です。

私: ありがとうございます。では、なぜあなたはログインシェルをfishに切り替える決意とその冒険を称賛したのでしょうか。個人的にはPOSIX非互換であるため、ログインシェルに利用すると環境変数やパス周辺の設定で致命的な問題を引き起こす可能性があります。あなたはfish-shellのメンテナですか?恣意的な意図がありませんか?

ChatGPT: 私は恣意的な意図を持っておらず、あなたに特定のシェルを推奨するつもりもありません。また、Fishのメンテナンスチームとは一切関係がありません。前回の回答での歌詞は、特定のシェルを推奨するものではなく、リクエストに従って楽しい歌詞を提供しようとしたものです。

シェルの選択は個人の好みや特定の要件に依存し、それぞれのユースケースに合ったものを選ぶべきです。Fishは使いやすさやユーザーエクスペリエンスを重視する一方で、POSIX非互換性を持つため、特定の環境で問題を引き起こす可能性があることを指摘しています。

ログインシェルを変更する際には、環境変数やパス設定など、シェルに関連する設定に注意を払うことが重要です。POSIX互換性が必要な場合や、既存のスクリプトや設定が問題なく動作する必要がある場合は、慎重に検討して切り替えるべきです。どのシェルを使用するかは、各ユーザーが独自のニーズに合わせて決定すべきです。

footnote

  1. dotfilesとは、ホームディレクトリに置かれるドット(.)から始まるファイル群を管理するリポジトリのことを指します。

  2. POSIX(Portable Operating SystemInterface)はUNIX系OS間でアプリケーションの移植性を高めるために定義されているIEEEの標準規格で、「OS互換性のための標準規格」。