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 as part of
mise bootstrap:
[bootstrap.user]
login_shell = "/bin/zsh"
Install the shell before applying this declaration and verify that the path exists. This setting changes the account's login shell; it does not install a shell, configure mise activation, or replace the current shell process.
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
Top-level mise bootstrap also ends with a reminder to start a new login
session when it changes, or would change, the login shell.
[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 user apply and
mise bootstrap apply it./etc/shells
before chsh accepts it. 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 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