This guide explains how to install, configure, and switch to Zsh as your default shell for an enhanced terminal experience. Follow these steps:
To see which shells are available on your system, run the following command:
cat /etc/shells
This will output a list of available shells on your system. Look for zsh
in the list. If it's not listed, you’ll need to install it.
Now, let's install zsh
. Below are the commands for different systems:
sudo apt update
sudo apt install zsh
sudo dnf install zsh
sudo yum install zsh
Once installed, check the version of Zsh to ensure it's installed:
zsh --version
You should see something like this:
zsh 5.x.x (x86_64-ubuntu-linux)
After installation, you can set Zsh as your default shell by running:
chsh -s $(which zsh)
This command sets Zsh as the default shell for your user. You’ll need to log out and log back in for the change to take effect. You can verify the default shell by running:
echo $SHELL
This should return something like:
/bin/zsh
When you first install Zsh, it may not create a .zshrc
file automatically. This file is essential because it stores configurations and settings for your Zsh environment.
To create a blank .zshrc
file, follow these steps:
-
Create a
.zshrc
File: Open a terminal and use a text editor to create the.zshrc
file in your home directory:vim ~/.zshrc
-
Open
.zshrc
and Place all This Containt: You can now open the file with your preferred text editor. and paste it on.zshrc
# ~/.zshrc file for zsh interactive shells. # see /usr/share/doc/zsh/examples/zshrc for examples setopt autocd # change directory just by typing its name #setopt correct # auto correct mistakes setopt interactivecomments # allow comments in interactive mode setopt magicequalsubst # enable filename expansion for arguments of the form ‘anything=expression’ setopt nonomatch # hide error message if there is no match for the pattern setopt notify # report the status of background jobs immediately setopt numericglobsort # sort filenames numerically when it makes sense setopt promptsubst # enable command substitution in prompt WORDCHARS=${WORDCHARS//\/} # Don't consider certain characters part of the word # hide EOL sign ('%') PROMPT_EOL_MARK="" # configure key keybindings bindkey -e # emacs key bindings bindkey ' ' magic-space # do history expansion on space bindkey '^U' backward-kill-line # ctrl + U bindkey '^[[3;5~' kill-word # ctrl + Supr bindkey '^[[3~' delete-char # delete bindkey '^[[1;5C' forward-word # ctrl + -> bindkey '^[[1;5D' backward-word # ctrl + <- bindkey '^[[5~' beginning-of-buffer-or-history # page up bindkey '^[[6~' end-of-buffer-or-history # page down bindkey '^[[H' beginning-of-line # home bindkey '^[[F' end-of-line # end bindkey '^[[Z' undo # shift + tab undo last action # enable completion features autoload -Uz compinit compinit -d ~/.cache/zcompdump zstyle ':completion:*:*:*:*:*' menu select zstyle ':completion:*' auto-description 'specify: %d' zstyle ':completion:*' completer _expand _complete zstyle ':completion:*' format 'Completing %d' zstyle ':completion:*' group-name '' zstyle ':completion:*' list-colors '' zstyle ':completion:*' list-prompt %SAt %p: Hit TAB for more, or the character to insert%s zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' zstyle ':completion:*' rehash true zstyle ':completion:*' select-prompt %SScrolling active: current selection at %p%s zstyle ':completion:*' use-compctl false zstyle ':completion:*' verbose true zstyle ':completion:*:kill:*' command 'ps -u $USER -o pid,%cpu,tty,cputime,cmd' # History configurations HISTFILE=~/.zsh_history HISTSIZE=1000 SAVEHIST=2000 setopt hist_expire_dups_first # delete duplicates first when HISTFILE size exceeds HISTSIZE setopt hist_ignore_dups # ignore duplicated commands history list setopt hist_ignore_space # ignore commands that start with space setopt hist_verify # show command with history expansion to user before running it #setopt share_history # share command history data # force zsh to show the complete history alias history="history 0" # configure `time` format TIMEFMT=$'\nreal\t%E\nuser\t%U\nsys\t%S\ncpu\t%P' # make less more friendly for non-text input files, see lesspipe(1) #[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" # set variable identifying the chroot you work in (used in the prompt below) if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then debian_chroot=$(cat /etc/debian_chroot) fi # set a fancy prompt (non-color, unless we know we "want" color) case "$TERM" in xterm-color|*-256color) color_prompt=yes;; esac # uncomment for a colored prompt, if the terminal has the capability; turned # off by default to not distract the user: the focus in a terminal window # should be on the output of commands, not on the prompt force_color_prompt=yes if [ -n "$force_color_prompt" ]; then if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then # We have color support; assume it's compliant with Ecma-48 # (ISO/IEC-6429). (Lack of such support is extremely rare, and such # a case would tend to support setf rather than setaf.) color_prompt=yes else color_prompt= fi fi configure_prompt() { prompt_symbol=㉿ # Skull emoji for root terminal #[ "$EUID" -eq 0 ] && prompt_symbol=💀 case "$PROMPT_ALTERNATIVE" in twoline) PROMPT=$'%F{%(#.blue.green)}┌──${debian_chroot:+($debian_chroot)─}${VIRTUAL_ENV:+($(basename $VIRTUAL_ENV))─}(%B%F{%(#.red.blue)}%n'$prompt_symbol$'%m%b%F{%(#.blue.green)})-[%B%F{reset}%(6~.%-1~/…/%4~.%5~)%b%F{%(#.blue.green)}]\n└─%B%(#.%F{red}#.%F{blue}$)%b%F{reset} ' # Right-side prompt with exit codes and background processes #RPROMPT=$'%(?.. %? %F{red}%B⨯%b%F{reset})%(1j. %j %F{yellow}%B⚙%b%F{reset}.)' ;; oneline) PROMPT=$'${debian_chroot:+($debian_chroot)}${VIRTUAL_ENV:+($(basename $VIRTUAL_ENV))}%B%F{%(#.red.blue)}%n@%m%b%F{reset}:%B%F{%(#.blue.green)}%~%b%F{reset}%(#.#.$) ' RPROMPT= ;; backtrack) PROMPT=$'${debian_chroot:+($debian_chroot)}${VIRTUAL_ENV:+($(basename $VIRTUAL_ENV))}%B%F{red}%n@%m%b%F{reset}:%B%F{blue}%~%b%F{reset}%(#.#.$) ' RPROMPT= ;; esac unset prompt_symbol } # The following block is surrounded by two delimiters. # These delimiters must not be modified. Thanks. # START KALI CONFIG VARIABLES PROMPT_ALTERNATIVE=twoline NEWLINE_BEFORE_PROMPT=yes # STOP KALI CONFIG VARIABLES if [ "$color_prompt" = yes ]; then # override default virtualenv indicator in prompt VIRTUAL_ENV_DISABLE_PROMPT=1 configure_prompt # enable syntax-highlighting if [ -f /usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh ]; then . /usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh ZSH_HIGHLIGHT_HIGHLIGHTERS=(main brackets pattern) ZSH_HIGHLIGHT_STYLES[default]=none ZSH_HIGHLIGHT_STYLES[unknown-token]=underline ZSH_HIGHLIGHT_STYLES[reserved-word]=fg=cyan,bold ZSH_HIGHLIGHT_STYLES[suffix-alias]=fg=green,underline ZSH_HIGHLIGHT_STYLES[global-alias]=fg=green,bold ZSH_HIGHLIGHT_STYLES[precommand]=fg=green,underline ZSH_HIGHLIGHT_STYLES[commandseparator]=fg=blue,bold ZSH_HIGHLIGHT_STYLES[autodirectory]=fg=green,underline ZSH_HIGHLIGHT_STYLES[path]=bold ZSH_HIGHLIGHT_STYLES[path_pathseparator]= ZSH_HIGHLIGHT_STYLES[path_prefix_pathseparator]= ZSH_HIGHLIGHT_STYLES[globbing]=fg=blue,bold ZSH_HIGHLIGHT_STYLES[history-expansion]=fg=blue,bold ZSH_HIGHLIGHT_STYLES[command-substitution]=none ZSH_HIGHLIGHT_STYLES[command-substitution-delimiter]=fg=magenta,bold ZSH_HIGHLIGHT_STYLES[process-substitution]=none ZSH_HIGHLIGHT_STYLES[process-substitution-delimiter]=fg=magenta,bold ZSH_HIGHLIGHT_STYLES[single-hyphen-option]=fg=green ZSH_HIGHLIGHT_STYLES[double-hyphen-option]=fg=green ZSH_HIGHLIGHT_STYLES[back-quoted-argument]=none ZSH_HIGHLIGHT_STYLES[back-quoted-argument-delimiter]=fg=blue,bold ZSH_HIGHLIGHT_STYLES[single-quoted-argument]=fg=yellow ZSH_HIGHLIGHT_STYLES[double-quoted-argument]=fg=yellow ZSH_HIGHLIGHT_STYLES[dollar-quoted-argument]=fg=yellow ZSH_HIGHLIGHT_STYLES[rc-quote]=fg=magenta ZSH_HIGHLIGHT_STYLES[dollar-double-quoted-argument]=fg=magenta,bold ZSH_HIGHLIGHT_STYLES[back-double-quoted-argument]=fg=magenta,bold ZSH_HIGHLIGHT_STYLES[back-dollar-quoted-argument]=fg=magenta,bold ZSH_HIGHLIGHT_STYLES[assign]=none ZSH_HIGHLIGHT_STYLES[redirection]=fg=blue,bold ZSH_HIGHLIGHT_STYLES[comment]=fg=black,bold ZSH_HIGHLIGHT_STYLES[named-fd]=none ZSH_HIGHLIGHT_STYLES[numeric-fd]=none ZSH_HIGHLIGHT_STYLES[arg0]=fg=cyan ZSH_HIGHLIGHT_STYLES[bracket-error]=fg=red,bold ZSH_HIGHLIGHT_STYLES[bracket-level-1]=fg=blue,bold ZSH_HIGHLIGHT_STYLES[bracket-level-2]=fg=green,bold ZSH_HIGHLIGHT_STYLES[bracket-level-3]=fg=magenta,bold ZSH_HIGHLIGHT_STYLES[bracket-level-4]=fg=yellow,bold ZSH_HIGHLIGHT_STYLES[bracket-level-5]=fg=cyan,bold ZSH_HIGHLIGHT_STYLES[cursor-matchingbracket]=standout fi else PROMPT='${debian_chroot:+($debian_chroot)}%n@%m:%~%(#.#.$) ' fi unset color_prompt force_color_prompt toggle_oneline_prompt(){ if [ "$PROMPT_ALTERNATIVE" = oneline ]; then PROMPT_ALTERNATIVE=twoline else PROMPT_ALTERNATIVE=oneline fi configure_prompt zle reset-prompt } zle -N toggle_oneline_prompt bindkey ^P toggle_oneline_prompt # If this is an xterm set the title to user@host:dir case "$TERM" in xterm*|rxvt*|Eterm|aterm|kterm|gnome*|alacritty) TERM_TITLE=$'\e]0;${debian_chroot:+($debian_chroot)}${VIRTUAL_ENV:+($(basename $VIRTUAL_ENV))}%n@%m: %~\a' ;; *) ;; esac precmd() { # Print the previously configured title print -Pnr -- "$TERM_TITLE" # Print a new line before the prompt, but only if it is not the first line if [ "$NEWLINE_BEFORE_PROMPT" = yes ]; then if [ -z "$_NEW_LINE_BEFORE_PROMPT" ]; then _NEW_LINE_BEFORE_PROMPT=1 else print "" fi fi } # enable color support of ls, less and man, and also add handy aliases if [ -x /usr/bin/dircolors ]; then test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" export LS_COLORS="$LS_COLORS:ow=30;44:" # fix ls color for folders with 777 permissions alias ls='ls --color=auto' #alias dir='dir --color=auto' #alias vdir='vdir --color=auto' alias grep='grep --color=auto' alias fgrep='fgrep --color=auto' alias egrep='egrep --color=auto' alias diff='diff --color=auto' alias ip='ip --color=auto' export LESS_TERMCAP_mb=$'\E[1;31m' # begin blink export LESS_TERMCAP_md=$'\E[1;36m' # begin bold export LESS_TERMCAP_me=$'\E[0m' # reset bold/blink export LESS_TERMCAP_so=$'\E[01;33m' # begin reverse video export LESS_TERMCAP_se=$'\E[0m' # reset reverse video export LESS_TERMCAP_us=$'\E[1;32m' # begin underline export LESS_TERMCAP_ue=$'\E[0m' # reset underline # Take advantage of $LS_COLORS for completion as well zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}" zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31' fi # some more ls aliases alias ll='ls -l' alias la='ls -A' alias l='ls -CF' # enable auto-suggestions based on the history if [ -f /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh ]; then . /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh # change suggestion color ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=#999' fi # enable command-not-found if installed if [ -f /etc/zsh_command_not_found ]; then . /etc/zsh_command_not_found fi
- Install Zsh via package manager.
- Set Zsh as the default shell using
chsh
. - Create and edit a
.zshrc
file for custom Zsh configurations.
by: Tanush Kushwah