👿

【Zsh】ターミナルに「+」から始まる行が大量に出るときの対処法

に公開

Cursor使っていたら、急に謎の出力が出てきました。Zsh を使っていると、ターミナルに以下のような行が大量に表示されることがあります。

+__vsc_precmd:1> local '__vsc_status=0'
+__vsc_precmd:2> [ -z 1 ']'
+__vsc_precmd:7> __vsc_command_complete 0
+__vsc_command_complete:1> [[ 'cat ~/.zshrc' ==  ]]
...

「なんだこの ‘+’ だらけの行は...!?」と驚くかもしれませんが、これは zsh のトレース出力 (xtrace) が有効になっている状態が原因です。

なぜ「+」がついた行が表示されるの?

zsh には、実行されているコマンドや関数の呼び出しをリアルタイムで表示する トレースモード (xtrace) という機能があります。
このトレースモードがオンになっていると、シェルが実行する各行の先頭に「+」が付いて端末に表示されます。

トレースモードは以下のようなコマンドによって有効になります。

set -x
# または
setopt xtrace

普段は使用しないことが多いのですが、何らかの理由(シェル設定ファイルへの追記や、VSCode 拡張機能の不具合など)で有効になってしまうことがあります。

一時的にトレース出力をオフにする方法

とりあえず「やめてほしい!」というときは、以下のコマンドをターミナルで実行するとトレースモードがオフになります。

set +x

または

unsetopt xtrace

これで、ターミナルに「+」から始まる行が表示されなくなります。
しかし、これは一時的な対応で、シェルを再起動するとまた表示される可能性があります。

永続的に直す方法

再度シェルを立ち上げても同じ現象が出る場合は、設定ファイルに set -x または setopt xtrace が記述されている ことが多いです。下記のファイルを一度確認しましょう。

  • ~/.zshrc
  • ~/.zprofile
  • ~/.zlogin
  • ~/.zshenv

これらのファイルのどこかに以下のような記述があればコメントアウトするか削除してください。

set -x
# または
setopt xtrace

変更を保存したら、ターミナルを再起動または source ~/.zshrc などで読み込み直すことで、トレースモードの自動有効化を止めることができます。

VSCode の連携スクリプトが原因の場合

記事冒頭の例のように __vsc_precmd や __vsc_command_complete といった文字列が含まれる場合、Visual Studio Code が zsh と連携するためのスクリプトが影響しているケースがあります。VSCode の拡張機能が自動的にシェルスクリプトを挿入し、その中で set -x を実行してしまうことがあるのです。

もし .zshrc などで VSCode に関連する記述を見つけたら、そこに set -x が含まれていないか確認してください。不要な場合は削除・コメントアウトして問題ありません。

まとめ

  • ターミナルに「+」がたくさん出る原因は、zsh のトレースモード (xtrace) が有効になっているため
  • 一時的には set +x または unsetopt xtrace で対処できる
  • .zshrc や VSCode のシェル統合スクリプトなどに set -x / setopt xtrace があれば削除・コメントアウトすると根本解決できる

「急にターミナルに意味不明なログが表示される...!」というときは、このトレースモードがオンになっていないか確認してみてください。

参考文献

  • Zsh のマニュアル (英語): set -x や unsetopt xtrace などのオプションについて詳しく解説しています。
  • Zenn @teru2teru: Zenn の筆者ページです。こちらのコンテンツもあわせてご覧ください。

これで「+」付きのデバッグ出力に悩まされず、快適に zsh ライフを楽しめるようになるはずです。何かあればコメントやツイートで教えてください!

Discussion