Diary of a Perpetual Student

Perpetual Student: A person who remains at university far beyond the normal period

標準エラー出力が見れなくなるpreztoユーザはバージョンを確認しよう

結論

  • 昔のpreztoを使っている人は、最新のリポジトリの状態を反映しよう

本文

僕のターミナルがおかしい

僕のターミナル環境はなにかがおかしい。何がおかしいかというと、標準エラー出力に書き込まれているものが見えなくなることがありました。

コマンドの実行に失敗しても結果が見れず何も表示されないため、「あれ?一瞬でコマンド終了したけど成功はしてないな?ステータスコードも0じゃないし……」と困惑していました。

経験的にCtrl+cを押した後に確率的に動かなくなるという感覚を持っていました。また、新しいタブを開くとそのタブでは問題が解消することも知っていました。

この現象が、OSを問わず、僕の使っているあらゆるPCで発生していて、とても気持ち悪いなと思っていました。

preztoが悪いのだろう

そんな生活を2年ほど続けていたのですが、さすがに嫌になってきたので、原因調査と問題解消に取り組むことにしました。

実は原因はzshの設定にあるのだろうということは大方分かっていました。Macのデフォルトシェルがzshになって、preztoを導入した頃からこの事象が発生し続けているからです。

pretzoとはzshフレームワークのようなもので、様々なプロンプトのテーマを選んだり、補完や情報表示ができるプラグインをかんたんに導入できたりするものです。好きな僕はprezto本家のリポジトリをフォークして自前のcustomを施したものを各PCでcloneして使っています。

github.com

こんなデザインのターミナルに見覚えがありませんか?

ただ、「prezto 標準エラー出力 見れない」などと検索してもそれっぽい情報にたどり着くことができず、甘んじて受け入れていたのです。

issue発見

今日は本気で調べようと思ったので、英語で「pretzo stderr」と検索したら、あっさりと同様の不具合を訴えるissueが見つかりました。

github.com

依存していた zsh-async で、stderrを/dev/nullにマップしたままにしてしまうバグがあったようで、現在は改修されているとのことです。

そういえば、最初にforkしてから一回も本家リポジトリの最新版をpullしていないなあということに気づきました。

問題解決

2, 3年分の変更をpullして、自前のカスタムとのコンフリクトを解消しつつpreztoを最新版に置き換えることができました。

$ cd ~/.zpretzo
$ git stash
$ git pull git@github.com:sorin-ionescu/prezto.git master
$ ## コンフリクト解消
$ git commit
$ git push origin master
$ git stash pop
$ ## コンフリクト解消
$ git restore --staged
$ git stash destroy

*1

何度かコマンド実行中にCtrl-cを押して確認していますが、標準エラー出力が見えなくなる事象は発生していないような気がします。

まとめ

一度整備した開発環境を弄るのは、壊れてしまう可能性もあるので躊躇われますよね。ただ、ソフトウェアが意味もなくアップデートすることはそれほど多くありません。今回はシェルの設定に問題がありましたが、開発環境を構成する様々な要素の更新履歴を定期的に確認し、暇な時間にアップデートする習慣をつけていきます。

*1:余談ですが、git checkoutがgit switchとgit restoreに分かれていたことを最近知りました。たしかにcheckoutでできることが広すぎましたね