wezterm, exit_behavior="CloseOnCleanExit"の対処法
発端
最近、Rust製ターミナルエミュレータのweztermを利用しているが、
CTRL-Dでターミナルを閉じることができない現象に見舞われた。
この状況が発生すると操作を受け付けなくなり、自分でターミナルを閉じるする他なくなる。
以下、その際に表示される表示エラー文
Process "/usr/bin/zsh" in domain "local" didn't exit celanly Exited with code 127.
This message is shown because exit_behavior="CloseOnCleanExit"
当初はzsh側の問題化と勘違いしていたが、wezterm側の設定であることが判明した。
原因
weztermのexit_behaviorと呼ばれる設定によるもの。下記参照
exit_behavior - Wez's Terminal Emulator
本現象は例えばタイポで存在しないコマンドを実行するなど、
コマンドの終了コードが0以外の際にCTLR-DでEOFを送ると発生する。
解説
exit_behaviorは文字通り、shell終了時のターミナルの制御設定である。
デフォルトの設定値が"CloseOnCleanExit"となっているが、これは下記のような制御を行う。
- 正常終了(0)なら端末を閉じる(Close)
- それ以外なら端末を開いたままにする(Hold)
weztermはCTRL-D実行時に最後のコマンドのステータスコードを読みに行くため、
例えばタイポ時の終了コード:127を参照してHold制御を実行して固まってしまう。
対処法
wezterm.lua等に以下の記述を追加する。本設定により確実にターミナルを終了できる。
exit_behavior = "Close"
なお2022/6/10現在、nightly build限定ではあるが
特定exitコードのみホワイトリスト化する場合はclean_exit_codesを利用可能なようだ。
clean_exit_codes - Wez's Terminal Emulator