In the world of Unix-like operating systems, the shell serves as a powerful interface for users to interact with the system. Among the various shells available, Zsh (Z Shell) stands out as a feature-rich and customizable alternative to the more traditional Bash shell. In this article, we’ll delve into the features that make Zsh a favorite among developers and system administrators alike, how to get started with it, and tips for enhancing your command line experience.
What is Zsh?
Zsh is an extended Bourne shell (sh) with many improvements, including features from Bash, ksh, and tcsh. It offers a robust scripting environment and a highly interactive command-line interface, making it ideal for both scripting and day-to-day terminal usage.
Bash vs zsh
Feature | Bash | Zsh |
Scripting Syntax | POSIX-compliant, widely used | Mostly POSIX-compliant Scri |
Tab Completion | Basic, can complete commands and file names | Advanced, context-aware, can complete options and arguments |
Prompt Customization | Limited options | Highly customizable (colors, icons, segments) |
History Management | Linear, basic | Advanced (e.g., shared history, timestamps, incremental history search) |
Theme Support | Limited | Extensive (Oh-My-Zsh, Powerlevel10k) |
Plugin System | Minimal | Robust plugin ecosystem (e.g., Oh-My-Zsh, Prezto) |
Performance | Generally fast | Similar performance, may slow down with many plugins |
Interactive Features | Basic | Rich features (e.g., spelling correction, path expansion) |
Error Handling | Basic | More advanced, can suggest corrections |
Learning Curve: | Familiar and straightforward for users who have experience with Linux command lines. | While it introduces new features, it may take time to fully utilize its capabilities. However, the benefits often outweigh the initial learning curve. |
Getting Started with Zsh
Installation
Zsh is available on most Unix-like operating systems. To install it on Ubuntu, for example, you can use:
sudo apt install zsh
On arch linux
sudo pacman -s zsh
Switching to Zsh
Once installed, you can switch to Zsh by simply typing:
zsh
Setting Zsh your default shell
chsh -s $(which zsh)
You may need to log out and log back in for the change to take effect.
Tips for Enhancing Your Zsh Experience
- Explore Themes: Experiment with different themes in Oh My Zsh to find one that suits your aesthetic and workflow.
- Utilize Plugins: Install plugins that cater to your needs. For instance, the git plugin offers useful aliases and functions for Git commands.
- Customize Your .zshrc: The .zshrc file in your home directory is where you can configure Zsh settings. Customize your prompt, enable plugins, and set environment variables here.
- Keyboard Shortcuts: Familiarize yourself with Zsh’s keyboard shortcuts for efficient navigation and command execution.
- Explore Advanced Features: Take advantage of Zsh’s advanced features like shared history, recursive globbing, and command correction to streamline your command line usage.
Plugins
Plugins are the main selling point of zsh. They extend the core functionality of zshell.
To manage / install plugins we will use “oh my zsh” which is an open source, community-driven framework for managing your Zsh configuration.
Installing “oh my zsh”
# with curl command
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
# with wget command
sh -c "$(wget https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"
# if curl is not installed in your distor you can use the wget verion .
.Zshrc file
When you install Zsh, it automatically creates a .zshrc file in your home directory. This file serves as the primary configuration for the “Oh My Zsh” framework, allowing you to add plugins, change themes, create aliases, and customize your environment.
Installing Plugins :
.You can explore the full list of supported plugins for “Oh My Zsh” here: https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins
Recommended plugins
While there are many plugins available, we recommend starting with the following to enhance your Zsh experience:
- zsh-syntax-highlighting
- zsh-autosuggestions.
To install these plugin simply the clone the its git repos to oh-my-zsh’s plugins directory
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
Now Activate the plugin in ~/.zshrc by : plugins=( zsh-autosuggestions zsh-syntax-highlighting). After modification your .zshrc should look like this . Note that git is a inbuilt plugin which is enabled by default for you.
# 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"
# Set list of themes to pick from when loading at random
# Setting this variable when ZSH_THEME=random will cause zsh to load
# a theme from this variable instead of looking in $ZSH/themes/
# If set to an empty array, this variable will have no effect.
# ZSH_THEME_RANDOM_CANDIDATES=( "robbyrussell" "agnoster" )
# Uncomment the following line to use case-sensitive completion.
# CASE_SENSITIVE="true"
# Uncomment the following line to use hyphen-insensitive completion.
# Case-sensitive completion must be off. _ and - will be interchangeable.
# HYPHEN_INSENSITIVE="true"
# Uncomment one of the following lines to change the auto-update behavior
# zstyle ':omz:update' mode disabled # disable automatic updates
# zstyle ':omz:update' mode auto # update automatically without asking
# zstyle ':omz:update' mode reminder # just remind me to update when it's time
# Uncomment the following line to change how often to auto-update (in days).
# zstyle ':omz:update' frequency 13
# Uncomment the following line if pasting URLs and other text is messed up.
# DISABLE_MAGIC_FUNCTIONS="true"
# Uncomment the following line to disable colors in ls.
# DISABLE_LS_COLORS="true"
# Uncomment the following line to disable auto-setting terminal title.
# DISABLE_AUTO_TITLE="true"
# Uncomment the following line to enable command auto-correction.
ENABLE_CORRECTION="true"
# Uncomment the following line to display red dots whilst waiting for completion.
# You can also set it to another string to have that shown instead of the default red dots.
# e.g. COMPLETION_WAITING_DOTS="%F{yellow}waiting...%f"
# Caution: this setting can cause issues with multiline prompts in zsh < 5.7.1 (see #5765)
# COMPLETION_WAITING_DOTS="true"
# Uncomment the following line if you want to disable marking untracked files
# under VCS as dirty. This makes repository status check for large repositories
# much, much faster.
# DISABLE_UNTRACKED_FILES_DIRTY="true"
# Uncomment the following line if you want to change the command execution time
# stamp shown in the history command output.
# You can set one of the optional three formats:
# "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd"
# or set a custom format using the strftime function format specifications,
# see 'man strftime' for details.
# HIST_STAMPS="mm/dd/yyyy"
# Would you like to use another custom folder than $ZSH/custom?
# ZSH_CUSTOM=/path/to/new-custom-folder
# Which plugins would you like to load?
# Standard plugins can be found in $ZSH/plugins/
# Custom plugins may be added to $ZSH_CUSTOM/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
# Add wisely, as too many plugins slow down shell startup.
plugins=(git zsh-syntax-highlighting zsh-autosuggestions)
source $ZSH/oh-my-zsh.sh
# User configuration
# export MANPATH="/usr/local/man:$MANPATH"
# You may need to manually set your language environment
# export LANG=en_US.UTF-8
# Preferred editor for local and remote sessions
# if [[ -n $SSH_CONNECTION ]]; then
# export EDITOR='vim'
# else
# export EDITOR='mvim'
# fi
# Compilation flags
# export ARCHFLAGS="-arch $(uname -m)"
# Set personal aliases, overriding those provided by Oh My Zsh libs,
# plugins, and themes. Aliases can be placed here, though Oh My Zsh
# users are encouraged to define aliases within a top-level file in
# the $ZSH_CUSTOM folder, with .zsh extension. Examples:
# - $ZSH_CUSTOM/aliases.zsh
# - $ZSH_CUSTOM/macos.zsh
# For a full list of active aliases, run `alias`.
#
# Example aliases
# alias zshconfig="mate ~/.zshrc"
# alias ohmyzsh="mate ~/.oh-my-zsh"
#
alias vi="nvim"
alias ls="lsd"
alias lsl="exa -al --group-directories-first"
alias bat="bat --theme gruvbox-dark"
alias rn="ranger"
Changing themes
Our “oh my zsh” framework comes with bunch of theme that you can find here : https://github.com/ohmyzsh/ohmyzsh/wiki/themes
To change the theme, first, locate the name of the built-in theme you want to use. Then, set the ZSH_THEME variable in your .zshrc file to the name of that theme
ZSH_THEME="agnoster"
Conclusion
Zsh is a powerful shell that enhances the command-line experience through its rich features, customization options, and supportive community. Whether you are a seasoned developer or just starting, switching to Zsh can significantly boost your productivity and enjoyment of the terminal. By leveraging its autocompletion, history management, and customizable environment, you can transform how you interact with your system.
So why not give Zsh a try? You might just find it becomes your new favorite shell!