docs/bootstrap/user.md
mise can declare the current user's login shell in [bootstrap.user] and
apply it with mise bootstrap user apply or
mise bootstrap:
[bootstrap.user]
login_shell = "/bin/zsh"
When the configured shell is not listed in /etc/shells, mise appends it
first. When the configured shell differs from the user's account entry, mise
runs:
chsh -s /bin/zsh
[bootstrap.user].login_shell follows the same manual, idempotent model as
bootstrap packages:
login_shell; unlike package/file lists, there is only one desired value.mise bootstrap applies it./etc/shells before chsh
accepts it on many platforms. mise adds the configured path to that file
when it is missing.chsh is not available,
mise bootstrap user status reports the entry as skipped and bootstrap
ignores it./bin/zsh or /opt/homebrew/bin/fish./etc/shells is usually root-owned. If the file is not writable, mise uses
the same non-interactive sudo behavior as system packages: it can prompt in an
interactive terminal, uses passwordless sudo in non-interactive contexts, and
honors system_packages.sudo = false.
When mise itself is started under sudo, login shell status and chsh
target SUDO_USER rather than root. Plain root sessions, such as containers,
still target root.
mise bootstrap user status # shows login shell state
mise bootstrap user status --missing # exit 1 if the shell differs or is not listed
mise bootstrap user apply # updates /etc/shells and runs chsh -s
mise bootstrap user apply --dry-run # print the commands instead
mise bootstrap user apply --yes # skip the confirmation prompt