特定のシェル設定をVSCodeのIntegrated Terminal内だけ適用しない方法

概要

.zshrc などのシェル設定ファイルで記述している変数設定を、VSCode の integrated terminal 内では適用しない、という事を実現しようとしたときに少しハマったのでメモします。

設定方法

結論、以下のように設定ファイル内で分岐させると動きます。

# .zshrc
if [ "$VSCODE_PID" = "" ] && [ "$TERM_PROGRAM" != "vscode" ]; then
    # VSCode以外で適用したい変数
    export SOMETHING="value"
fi

判定で必要な変数は2つ

実行環境が Integrated Terminal か判定する方法については記事がいくつかあり参考にさせてもらいました。

「VSCode で開いたシェルだけ ○○ をする」といったことを実現しようと思った時, Google などで検索すると VSCODE_PID 環境変数で識別するとよい... という情報を得ることができたのですが, VSCode 1.26 より VSCODE_PID 環境変数はセットされなくなったので, 上記エントリにもあるように, TERM_PROGRAM 環境変数で識別するようにしましょう.

VSCode で開かれたシェルであることを環境変数から知る方法 - Masteries

しかし記事上で書かれているように TERM_PROGRAM で分岐を書いてみたところ、Integrated Terminal でも不要な環境変数がセットされてしまいハマりました。

調べると VSCode が .zshrc を読み込む際に以下のように動いているように見えました。(1.61.0 にて確認)

  • VSCode の Integrated Terminal を起動すると、.zshrc は 2 回読み込まれている(pgrep してみると zsh プロセスが2つ立ち上がっている)
  • .zshrc 側で printenv してみると 1 度目の読み込み時のみ VSCODE_PID が存在
  • 2 度目の読み込みでは TERM_PROGRAM=vscode のみ存在

つまり If 文では VSCODE_PID と TERM_PROGRAM 両方を見ておかないと Integrated Terminal で適用したくない設定が反映されます。

ちなみに Integrated Terminal 上で echo を叩いたりすると VSCODE_PID は存在しないので、ターミナル内でスクリプトを実行したい時は TERM_PROGRAM だけ参照すれば問題なさそうです。 .zshrc のようなターミナル起動時に読み込まれる設定ファイルでは注意が必要という事でした。

Tweet