先月Ubuntu 22.04 LTS がリリースされましたね。機能として何が変わったのかまだ詳しく把握してませんが、とりあえず実験用として使っている手元の Lenovo ノートの Ubuntu を 20.04 から 22.04 にアップデートしてみました。ソフトの依存関係がよくわからんのでサーバはひとまず様子見。
ついでに、環境イッキに刷新しちゃおうということで、前から気になっていた fish を導入してデフォルトにしてみたらめちゃくちゃ良かったよっていう話です。
Ubuntu 20.04 LTS → 22.04 LTS のアップデート
自分はライトなユーザなので LTS 以外は試したことないので、普通に 20.04 からの乗り換えです。
sudo apt update && sudo apt upgrade && sudo apt autoremove && sudo apt clean
何をするにもいつもどおりパッケージアップデートして、
sudo apt dist-upgrade && sudo apt install update-manager-core
ディストリビューションのアップグレードの確認をします。んで
tail -n 1 /etc/update-manager/release-upgrades
release-upgrade の設定を確認します。 Prompt=lts となっていればOK。normal とかになっていたら vim とかで開いて lts にしてあげます。そしたら次のコマンドを打ってアップデートを始めます。
sudo do-release-upgrade -d
アップグレードには結構時間がかかります。体感 30 ~ 1時間くらいかかりました。
途中でいくつかソフトウェアのアップデートについて確認をされますのでよく確認して y か n かを選択します。これは環境によって異なってくるので一概には言えません。
例えば、 sshd_config で何かしら設定していた場合、途中で選択画面が表示され、新しいバージョンのものをインストールするか、既存のものを残すか聞かれます。私は既存のものを残しました。
各パッケージのアップデートが終わると再起動の確認がされるので、 y で Enter すると再起動。立ち上がると 22.04 にアップデートされていました。
アップデート後にできているかの確認は、以下のコマンドで
lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04 LTS
Release: 22.04
Codename: jammy
と返ってくれば OK です。
所感
リリースノートをみて、気になった変更点は
- SHA1, MD5等のレガシーアルゴリズムの暗号化がデフォルトで無効化
という点でしょうか。サーバへの鍵認証にSHA1の鍵を使っている人はセキュリティレベルを下げる変更をしないと認証できなくなったみたいです。Windows ユーザの人とかだと、TeraTermとかのSSHクライアントはSHA2に未対応だったりするのでみんなアウトになるみたいですね(自分はWindowsでターミナルに触ろうと思ったことがないので知らん)。素直に WSL になんでもいいから Linux 入れて SSH すればいいんですかね。
Desktop の所感は、ミッションコントロールが個人的に使いやすくなった気がします。あと、libinput-gesture を入れなくてもタッチパッドジェスチャーに対応したんですかね?無効にしても3本指上スワイプでミッションコントロールに入れるようになってる?あとスクリーンショットのソフトが無くなって、その代わり PrtSc キーを押すだけですぐGUIで範囲指定したりしながらスクリーンショットや動画を撮れるようになったみたいです。個人的に便利。
あとは 20.04 の頃は高頻度で IME がバグって日本語入力認識しなくなってたのが、22.04 にしてからは一度も起きなくなったくらいですね。
fish のインストール
fish は POSIX 非互換のシェルスクリプトであり、sh の古い文法を切り捨ててブラッシュアップしたものです。
- 特に学習コストをかけず使い始められる
- シンタックスハイライトが読みやすい
- サジェストが強い
- コマンド置換(abbr)ができる
- デフォでもだいぶ使いやすいし、プラグインによる拡張性もある
と、主に学習コストをかけることなく便利になりそうだったので導入してみることにしました。
自分で作るスクリプトは fish 文法で書けばいいし、対して使いまわしたいような shell 資産を自分は持ってないし、拾い物を動かすときはその時だけ bash で実行すればいいのです。
sudo apt install -y fish
fish はプラグインマネージャに fisher というものを使うのでそれもインストール、プラグインを絶対に使わないという人はいらん…かも?
curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher
デフォルトのシェルを変更するには 以下のコマンドをします。
which fish
# fish のパスを確認
chsh
# さっきのパスを入力
私は現状上記の設定はせずデフォルトは bash のままで都度 fish に切り替えています。理由は、vs code の ssh remote を用いてアクセスする際にログインシェルが bash でないとログインできない(設定を変えれば可能)問題があるのと、anaconda で管理している Python を利用する際に、fish 上で set した PYTHONPATH が vs code に認識してもらえないからです。解決できたらログインシェルを変更したいが…
以上の問題があるため、自分はログインシェルを bash にしたまま、 .bashrc の先頭に
export PYTHONPATH="$HOME/WORK/__lib__:$PYTHONPATH" # PYTHONPATH 通さない人は要らない
exec fish
として、bash 起動後にすぐ fish を起動するようにしています。bashを使いたいときはここをコメントアウトしてから exec bash しなければなりませんが、自分は別にbashで動かしたいシェルの資産とかないので、これで十分です。
プラグインのインストール
fisher を使ってプラグインを入れます。ネットで調べるとfisher add だの fisher install だの出てきますが、サブコマンドがバージョンで変わっているようです。add が古くて v4.3.1 現在は fisher install のようです。
テーマ
まず見た目をいい感じにします。
fish_config コマンドを入力するとブラウザが立ち上がるので、そこからデフォルトで用意されている見た目を選んでもいいんですが、プラグインテーマを入れるともっとイイカンジの見た目にできます。
まず、oh-my-fish 系のテーマはpowerline fonts を使っていて、インストールしないと文字化けするのでインストールします
git clone https://github.com/powerline/fonts.git
./fonts/install.sh
rm -rf ./fonts
フォントをインストールできたら、使っているターミナルのフォントをなんでもいいので Powerline 系のものに変更します。
そしたらテーマを選んで入れますが、人気があるのは git のブランチやステージングの状態をスマートに表示してくれる oh-my-fish/theme-bobthefish か oh-my-fish/theme-agnoster あたりのようですね。自分は
- Python の環境が表示される(2箇所でちゃうのはウザいけど)
- 実行時間が表示される
という 2点が良くて bobthefish の方にしました。逆に agnoster はそれが表示されないので画面がゴチャつかないでシンプル。
fisher install oh-my-fish/theme-bobthefish
便利系
たくさん入れて何使ってんのかわかんなくなるのが嫌なので自分は最低限で。
① z
cd の便利版みたいなもの。履歴から過去に行ったことのあるディレクトリを検索して移動してくれる。
fisher install jethrokuan/z
z fish # 過去に行ったことがあれば、~/.config/fish に cd してくれる\
②fzf
fuzzy finder(曖昧検索)。これをインストールしてから grep を使わなくなった。詳細な使い方はちょい長いので調べてください。
sudo apt install -y fzf
fisher install jethrokuan/fzf
history | fzf # コマンド履歴を曖昧検索できる画面に入る
設定ファイルの編集
bash でいう .bashrc のようなファイルは、 ~/.config/fish/config.fish になります。
自作コマンドを作るときは、 ~/.config/fish/functions/ に コマンド名.fish と名前をつけて同名の関数をファイル内に定義すれば作れます。最初からパスが通っているのでわかりやすくていいですね。
自分の設定ファイルをおいておきます。コマンドファイルを作るまでもない自作関数を config_functions.fish というファイルにまとめてしまってしまっています(functions/ 以下はプラグインのファイルも入っていたりして git管理が面倒なので)。
2022.11.25追記
fish 単体でのレポジトリは爆破したので、こっちに移動しました。これをコピーするだけでプラグインとかも全部導入済み。
コマンド置換について
fish では alias の別にコマンドに別名をつける方法があります。
# 'ls -alFX' というコマンドに ll という別名をつける
abbr -s ll ls -alFX
これが alias と何が違うかというと、ターミナル上で入力して Enter かスペースを入力すると、置換対象に展開されて置き換えられます。ターミナル上での表示でも history 上でも元々のコマンド名で記録されるので、
- 実行時にオプションを変更できる
- 他の人が見たときになにしてるかわかりやすい
というメリットがあります(alias vi=’nvim’ みたいな恒常的に変えておくべきだというコマンドは alias でいいので、使い分けるのがいいでしょう)。
また、 abbr は alias と違い、config ファイルの読み込み時に認識するのではなくコマンド実行時に保存されるので、起動ごとに都度入力する必要はありません。
自分は逆にこの仕様のせいで abbr に何を設定しているのかわからなくなるので、config_abbr.fish に abbr コマンドをまとめて
for a in (abbr --list); abbr --erase $a; end
source ~/.config/fish/config_abbr.fish
と config.fish に書くことで、読み込み時に都度 abbr の設定を全て削除して設定し直すということをしています。
所感
慣れると bash には戻れないくらい楽ですね。VS code で使うための環境設定だったりが大変だったけどやってよかったと思う。プラグインを増やしていくかは今後ちょっとずつ遊びながら検討。
終わりに
長いし絶対に記事を2つに分ければよかったと思う。書き始めてから公開まで 1週間かかってる。忙しい時期に現実逃避にこんなことをするな。
次回は一人前のvimmer に憧れて、vim から neovim に乗り換えてモリモリに設定した話を忘れないうちに書こうと思っている。もうすでに半分やったこと忘れてる。