Zshからfishに移行した

κeenです。ログインシェルを長年使ってきたzshからfishに移行したのでその記録。

私はターミナル環境をRust製のもので揃えていて、ターミナルはalacritty、ターミナルマルチプレクサはzellijを使っています。最後のピースとしてシェルがzshで残っていました。Ubuntu 26.04になってfishが4.x系統になり、fishは4.xからRust製になったのでfishを使えばターミナル環境がRustで揃います。まあ、別にRustで揃えることに意味や実利はなくただの趣味というか使って応援という形ですね。

因みにCLI環境として普通の cat やら mkdir やらのcoreutilsはどうなんだってのが気になると思いますが、これもUbuntu 25.10でRust製のものになったのでほんとうに全部Rustになってしまいました。coreutilsが一番難しいと思ってたので先にRust化したのは意外でしたね。

さて、移行するにあたってコンフィグファイルとシェルのヒストリの移植が必要になります。 コンフィグファイルはローカルLLMの実力試しがてらGemma4を使って翻訳させてみました。一日かかりましたが、一応それっぽいものは出来上がりました。プロンプトを色々と細工してたのを頭使わずに移植できたのはうれしいですね。細工していた話は↓に書いてあります。

シェルのプロンプトへのこだわり #shell - Qiita

まあ、完璧という訳ではなくて人間の手で微調整が必要でしたが、それでも手間を大幅に省けたのはうれしいです。

次にシェルのヒストリはzshとfishで形式に互換性がないのでそのままファイルを cp する訳にはいきません。多少悩みましたが、雑にzshのヒストリを1行ずつ読み込んでfishのヒストリに追加する方法をとりました。

cat ~/.histfile | while read line
    history append "$line"
end

fishは history append でコマンドを実行せずにヒストリ追加できるんですね。ただしこの方法はかなり雑で、zshの複数行ヒストリをちゃんと扱えてませんし、 history append を行数分呼ぶのでめちゃくちゃ遅いです。

探したらzsh → fishのヒストリ移植ツールくらい作ってる人がいると思いますが、私が満足してるのでこれでよいでしょう。いざとなったらまだとっておいてあるzshのヒストリファイルからコマンドをコピペしてくればいいだけですしね。

使ってみて

実利をとって移行した訳ではないので、正直使いづらいというか馴れないところが多いですね。補完にクセがあったりシェルの文法がPOSIX拡張でなかったり。私は一時期POSIX ShellでプログラミングしてたことがあるのでPOSIX拡張かどうかが使いやすさに直結します。 とはいえ機能の良し悪しではなく馴れないことが原因なのでそのうち馴染むでしょう。

そのうちニッチな機能とか掘り起こせたらいいですね。

Written by κeen