Bash is fine. Zsh is better for daily driving on a server you actually live inside. Tab completion is smarter, history search beats Ctrl-R, the prompt tells you more without extra effort, and once you add the right plugins you get inline command suggestions and real-time syntax highlighting. Pair it with tmux and you have a serious terminal workspace. Oh My Zsh wraps all of this in a config framework that takes five minutes to install and ships with hundreds of themes and plugins.
This guide installs Zsh, drops in Oh My Zsh, adds two of the must-have plugins (zsh-autosuggestions and zsh-syntax-highlighting), and sets Zsh as the default login shell. The commands are verified on Rocky Linux 10.1, Debian 13 (trixie), and Ubuntu 24.04 LTS. Zsh is in the default repositories on all three, so no extra repos needed.
Tested April 2026 on Rocky Linux 10.1 and Debian 13 trixie with Zsh 5.9 and Oh My Zsh master branch
Step 1: Install Zsh and git
Oh My Zsh and the plugins below are git repositories, so you need git present alongside zsh.
On Rocky Linux 10, AlmaLinux 10, and RHEL 10:
sudo dnf install -y zsh git curl
On Debian 13 and Ubuntu 24.04 LTS:
sudo apt update
sudo apt install -y zsh git curl
Confirm the installed version. All three distros currently ship Zsh 5.9:
zsh --version
Both distros currently ship the same upstream release:
zsh 5.9 (x86_64-redhat-linux-gnu)
The Zsh binary lands at /usr/bin/zsh and is automatically registered in /etc/shells, which is what chsh requires before it will accept the change.
grep zsh /etc/shells
Both paths are registered, so chsh will accept either one:
/usr/bin/zsh
/bin/zsh
Step 2: Install Oh My Zsh unattended
Oh My Zsh ships an installer that clones itself to ~/.oh-my-zsh, backs up any existing ~/.zshrc, writes a new one, and optionally changes your login shell. The --unattended flag skips the final prompt so this works over SSH without a TTY:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended
When it finishes, the installer prints its banner:
__ __
____ / /_ ____ ___ __ __ ____ _____/ /_
/ __ \/ __ \ / __ `__ \/ / / / /_ / / ___/ __ \
/ /_/ / / / / / / / / / / /_/ / / /_(__ ) / / /
\____/_/ /_/ /_/ /_/ /_/\__, / /___/____/_/ /_/
/____/ ....is now installed!
Check that ~/.zshrc now points at the framework:
head -15 ~/.zshrc
The new file sources Oh My Zsh and sets the default theme:
# If you come from bash you might have to change your $PATH.
# export PATH=$HOME/bin:$HOME/.local/bin:/usr/local/bin:$PATH
# Path to your Oh My Zsh installation.
export ZSH="$HOME/.oh-my-zsh"
# Set name of the theme to load --- if set to "random", it will
# load a random theme each time Oh My Zsh is loaded, in which case,
# to know which specific one was loaded, run: echo $RANDOM_THEME
# See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
ZSH_THEME="robbyrussell"
The default theme robbyrussell is deliberately minimal. If you prefer something richer, try agnoster, powerlevel10k, or pick from the ~150 themes shipped under ~/.oh-my-zsh/themes/. Change the line by editing ~/.zshrc and running exec zsh.
Step 3: Add the two must-have plugins
Out of the box, Oh My Zsh enables only the git plugin. The two plugins below genuinely change how the shell feels once installed. zsh-autosuggestions shows a greyed-out completion from history as you type, and zsh-syntax-highlighting colours commands as valid or invalid before you press Enter. Neither lives inside Oh My Zsh so you clone them into the custom plugin directory:
git clone https://github.com/zsh-users/zsh-autosuggestions \
~/.oh-my-zsh/custom/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting \
~/.oh-my-zsh/custom/plugins/zsh-syntax-highlighting
Confirm both are in place under the custom plugins directory:
ls ~/.oh-my-zsh/custom/plugins/
Both repositories are now sitting alongside the built-in example placeholder:
example
zsh-autosuggestions
zsh-syntax-highlighting
Now register them in the plugins= line of ~/.zshrc. While you’re there, add the two built-in plugins that save the most typing: sudo (press Escape twice to prepend sudo to the last command) and history (adds h, hs, and hsi aliases for history navigation).
sed -i 's/^plugins=(git)/plugins=(git zsh-syntax-highlighting zsh-autosuggestions sudo history)/' ~/.zshrc
grep ^plugins= ~/.zshrc
The updated plugin list should look like this:
plugins=(git zsh-syntax-highlighting zsh-autosuggestions sudo history)
The order matters. zsh-syntax-highlighting must be the last plugin in the list, because it hooks into the Zsh line editor and expects nothing after it to register another widget.
Step 4: Set Zsh as the default login shell
Use chsh (change shell) to point your user at the Zsh binary. You need sudo to change someone else’s shell or if PAM complains about the current session:
sudo chsh -s /usr/bin/zsh $USER
getent passwd $USER
The last field of the passwd entry should now be /usr/bin/zsh (or /bin/zsh on Debian-family systems where /bin is just a symlink):
rocky:x:1000:1000:Cloud User:/home/rocky:/usr/bin/zsh
The next login will drop you straight into Zsh. To switch inside the current session without logging out, run exec zsh. The first time you start Zsh after enabling a new plugin, Oh My Zsh regenerates its compdump, which is why the first prompt takes an extra second or two.
Step 5: Verify the full stack loads
A quick self-test in a non-interactive Zsh confirms the theme name, the active plugin list, and that the custom plugins loaded cleanly:
zsh -i -c 'echo THEME=$ZSH_THEME; echo PLUGINS=$plugins; zsh --version'
Every line should match what you configured earlier:
THEME=robbyrussell
PLUGINS=git zsh-syntax-highlighting zsh-autosuggestions sudo history
zsh 5.9 (x86_64-redhat-linux-gnu)
From here, log out and log back in to experience what Zsh actually feels like. As you start typing a command you’ll see a greyed suggestion from history to the right of the cursor (press right-arrow to accept). Commands turn green when the shell recognizes the binary in $PATH and red when they don’t, which catches typos before you run them.
Going further with themes
The community favourite these days is Powerlevel10k, a fast theme with a built-in configuration wizard. Install it into the custom themes directory, set it as the theme, and the wizard runs the first time you start Zsh:
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git \
~/.oh-my-zsh/custom/themes/powerlevel10k
sed -i 's/^ZSH_THEME=.*/ZSH_THEME="powerlevel10k\/powerlevel10k"/' ~/.zshrc
exec zsh
We have a dedicated walkthrough on configuring Powerlevel10k on Linux and macOS including glyph font setup and prompt segments. For a lighter alternative with no external fonts, agnoster is baked into Oh My Zsh and just works.
Uninstalling cleanly
If you decide Zsh isn’t for you, Oh My Zsh ships its own uninstaller and chsh reverts the default shell:
uninstall_oh_my_zsh
sudo chsh -s /bin/bash $USER
The uninstaller removes ~/.oh-my-zsh and restores the ~/.zshrc backup it made during install. Your history file (~/.zsh_history) is left in place in case you want to keep it around.
Wrap up
Zsh with Oh My Zsh and the autosuggestion + syntax-highlighting plugins is one of those rare upgrades that pays off the same day. Total install footprint is around 25 MB, the framework updates itself weekly via omz update, and nothing about it prevents scripts from running under bash when they need to. For related quality-of-life upgrades, see our guide on enabling bash completion inside Zsh and our tmux cheat sheet so you don’t lose any of your muscle memory. On a Debian-family box, SSH key authentication pairs nicely with Oh My Zsh’s ssh-agent plugin.