dotfiles盆栽記6: シェルの再起動コマンドをエイリアスにするのを止めた

減らすという所作も盆栽に含まれるだろう。

モチベーション

以前はTerminal.appを使っていたが最近はWarp*1を使っている。カスタマイズせずにコマンドの補完やブランチ表示をしてくれるので気に入っている。今回はTerminal.appで使っていた再起動コマンドがWarp上では期待した動作にならなかったので修正していく。

シェルの再起動が必要なケース

そもそも修正する必要はあるのか?手癖でシェルの再起動をしている気がしていて不要かもしれない。シェルの再起動が必要なケースを洗い出す。

  • .zshrc を書き換えた時

これしか思い浮かばず、頻度が少ないのでエイリアス不要と判断した。

とはいえ、モチベーションに書いた問題が気になるので解決する。

問題

Terminal.appで使っていた再起動コマンドがWarp上では期待した動作にならなかった

alias resh='exec $SHELL -l'
Warp (通常時のすがた)
Warp (`exec $SHELL -l` 実行後のすがた)

シェルを再起動するとWarpの設定が完全に適用されていない不完全な状態になる。

アプローチ

問題の根本原因は分からないが、Warp自体を再起動すれば良さそう。コマンドからアプリケーションの再起動をしたことが無かったので調べた。

open -a Warp.app

上記がシンプルなアプリ起動。help*2を見るとリフレッシュのフラグがあった。

open -F -a Warp.app

こうすると変数はリセットされたが、.zshrc に更新がある場合に反映されなかった。もう一息っぽい。helpを見るとアプリの新しいインスタンスを開く、みたいなフラグがあった。

open -n -a Warp.app

これで変数もリセットされていて、.zshrc の更新も反映されそう。だが新しくウィンドウが開くので無限にウィンドウが開いてしまう。古いウィンドウは消したい。

パッと思いつく方法は再起動を実行するプロセスを自身でkillしてWarpを開けば良さそう。

試行錯誤していると自分自身をkillした後に何かするには一工夫必要みたいで面倒だった。順序逆転させてもやりたいことは実現できるので新しくWarpを立ち上げてから自分自身をkillさせるようにした。

open -n -a Warp.app; kill $PPID

これでウィンドウが切り替わるという微妙な点を置いてはうまくいった。 kill $$ では上手くいかなかった。親プロセスごとkillしないと駄目で少しワイルドかもしれない。

*1:https://www.warp.dev/

*2:実際にはhelpのサブコマンドはなくて、openだけで実行すると終了ステータス1でサブコマンドの一覧が出力される