🦓
Zed のターミナルが zsh で起動される(デフォルトシェルは fishなのに)
Zed のターミナルがなぜだか zsh で起動されてしまってしばらく悩みました。
昨日はそんなことなかったのに。
調べた
# システムのデフォルトシェル(dscl で設定)
$ dscl . -read $HOME UserShell
UserShell: /opt/homebrew/bin/fish
# 環境変数
$ echo $SHELL
/bin/zsh
デフォルトシェルと $SHELL 環境変数が一致していない。
でも昨日はそれでも問題なかった…。
原因
macOS の GUI アプリは dscl で設定したログインシェルを直接参照しないらしい。
環境変数の継承フロー
- GUI アプリは起動時に親プロセス(launchd)から環境変数を継承
- launchd の環境には SHELL が設定されていない
- システムのフォールバックとして /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