Shell
Homebrew bash 5 is the login shell. The whole configuration is one file.
~/.bashrc
Section titled “~/.bashrc”export PATH="$HOME/.local/share/mise/shims:$HOME/.local/bin:$HOME/.bun/bin:/opt/homebrew/bin:/opt/homebrew/sbin:$PATH"export EDITOR="code --wait"export VISUAL="$EDITOR"export HOMEBREW_NO_ENV_HINTS=1export IOS_SIMULATOR_POOL_SIZE="${IOS_SIMULATOR_POOL_SIZE:-3}"
for f in "$HOME/.config/secrets.env" "$HOME/.codex/secrets/linear.env"; do [ -r "$f" ] && . "$f"done
case $- in *i*) alias claude='command claude --dangerously-skip-permissions' alias maude='clear; ssh -t maude cc' ;;esac- mise shims come first so every tool resolves without
mise activate, including inbash -c. ~/.config/secrets.envis where API keys go. It is untracked and mode 600. The Codex secrets file is sourced too so both agents see the same variables.- The two aliases are the only interactive-only lines.
~/.bash_profile sources ~/.bashrc, so login shells and interactive shells are identical.
~/.zshenv
Section titled “~/.zshenv”emulate sh -c '. "$HOME/.bashrc"'Anything that still runs zsh -c gets the same PATH and secrets. There is no .zshrc.
How agents pick the shell
Section titled “How agents pick the shell”- Codex reads the login shell from the user record. After
chshit uses bash immediately. - Claude Code uses
$SHELL.CLAUDE_CODE_SHELLis pinned to/opt/homebrew/bin/bashin its settings so it does not depend on the parent process. - T3 Code and other GUI apps inherit
SHELLfrom the login session.run_once_after_set-login-shellsets it withlaunchctl setenvso apps launched after the switch get bash without logging out.
Login shell on a new machine
Section titled “Login shell on a new machine”run_once_after_set-login-shell adds /opt/homebrew/bin/bash to /etc/shells, runs chsh, and sets the launchd variable. It asks for sudo once.