TechsMex

技術エンジニア C++/Python/Java

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