🦓

Zed のターミナルが zsh で起動される(デフォルトシェルは fishなのに)

に公開

Zed のターミナルがなぜだか zsh で起動されてしまってしばらく悩みました。
昨日はそんなことなかったのに。

調べた

# システムのデフォルトシェル(dscl で設定)
$ dscl . -read $HOME UserShell
UserShell: /opt/homebrew/bin/fish

# 環境変数
$ echo $SHELL
/bin/zsh

デフォルトシェルと $SHELL 環境変数が一致していない。
でも昨日はそれでも問題なかった…。

原因

macOS の GUI アプリは dscl で設定したログインシェルを直接参照しないらしい。

環境変数の継承フロー

  1. GUI アプリは起動時に親プロセス(launchd)から環境変数を継承
  2. launchd の環境には SHELL が設定されていない
  3. システムのフォールバックとして /bin/zsh(macOS Catalina 以降のデフォルト)が使われる

起動方法による違い

起動方法 親プロセス $SHELL
ターミナル(fish)から zed . fish /opt/homebrew/bin/fish
Dock / Spotlight から起動 launchd /bin/zsh(フォールバック)

解決策

方法 1: Zed の設定で明示的にシェルを指定

Zed の settings.json:

"terminal": {
  "shell": {
    "program": "/opt/homebrew/bin/fish"
  }
}

方法 2: ターミナルから起動する

zed .

こうすればターミナルの $SHELL を継承するため、fish が使われます。ずっと zed . で使ってたから気が付かなかった。

Discussion