6 min read

Install ZSH for Ubuntu Terminal

Install ZSH for Ubuntu Terminal
Photo by Gabriel Heinzer / Unsplash

Hello guys, it's great when doing something with the Terminal instead of GUI tools. It makes you like a real hacker :D

And if you want to customize something for the Terminal that looks better than default. So this post is for you.

This is the default terminal at the beginning.

And after configured



git should be installed.
curl should be installed.

Install ZSH

sudo apt install zsh

Install Oh My ZSH

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"


  1. Verify installation by running zsh --version. Expected result: zsh 5.8.1 or more recent.
  2. Make it as your default shell by running chsh -s $(which zsh)
  3. Log out and log back in again to use your new default shell.
  4. Test the default shell by running echo $SHELL. Expected result /bin/zsh
  5. Test with $SHELL --version. Expected result: zsh 5.8.1 or similar

Install a theme

The theme spaceship is my favorite theme, you can use it like me or choose another one, It's up to you.

Install font Fira Code

To use some special characters, we should install font Fira Code, which is a monospaced font with programming ligatures.

sudo apt install fonts-firacode

Download theme

Clone the repo to zsh custom folder.

git clone https://github.com/spaceship-prompt/spaceship-prompt.git "$ZSH_CUSTOM/themes/spaceship-prompt" --depth=1

Symlink spaceship.zsh-theme to your oh-my-zsh custom themes directory.

ln -s "$ZSH_CUSTOM/themes/spaceship-prompt/c" "$ZSH_CUSTOM/themes/spaceship.zsh-theme"

Set zsh theme value to ZSH_THEME variable in the file ~/.zshrc



Reload zsh configuration by running source ~/.zshrc

Configure theme spaceship

  1. Create new configuration file for theme spaceship by running touch ~/.spaceshiprc.zsh
  2. Add these values into it, you can configure more if you want, please read its document.
  time          # Time stamps section
  user          # Username section
  dir           # Current directory section
  git           # Git section (git_branch + git_status)
  package       # Package version
  node          # Node.js section
  golang        # Go section
  exec_time     # Execution time
  line_sep      # Line break
  jobs          # Background jobs indicator
  exit_code     # Exit code section
  char          # Prompt character


Install plugins

Install plugin zsh-autosuggestions

It suggests commands as you type based on history and completions.


  1. Clone the repo into $ZSH_CUSTOM/plugins (by default ~/.oh-my-zsh/custom/plugins)
    git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

  2. Add the plugin to the list of plugins for Oh My Zsh to load (inside ~/.zshrc):

    # other plugins...

Install plugin zsh-syntax-highlighting

It enables highlighting of commands while they are typed at a zsh prompt into an interactive terminal. It helps in reviewing commands before running them, particularly in catching syntax errors.


  1. Clone the repo into $ZSH_CUSTOM/plugins (by default ~/.oh-my-zsh/custom/plugins)
    git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

  2. Add the plugin to the list of plugins for Oh My Zsh to load (inside ~/.zshrc):

    # other plugins...

Install plugin zsh-completions

It provides additional completion definitions for scripts which are not available in Zsh yet. E.g. yarn, nvm, node,...


  1. Clone the repo into $ZSH_CUSTOM/plugins (by default ~/.oh-my-zsh/custom/plugins)
    git clone https://github.com/zsh-users/zsh-completions ${ZSH_CUSTOM:-${ZSH:-~/.oh-my-zsh}/custom}/plugins/zsh-completions

  2. Add it to FPATH in your .zshrc by adding the following line before source "$ZSH/oh-my-zsh.sh":


Configure Terminal

Adjust Terminal UI like font family, background color, text color,...
We can enhance it from the tab Preferences


Create new Profile.

And customize Text, Color,...

Review .zshrc

If you want to check the file .zshrc from my side, here is for it.

# If you come from bash you might have to change your $PATH.
# export PATH=$HOME/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

# 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.

# Uncomment the following line to use hyphen-insensitive completion.
# Case-sensitive completion must be off. _ and - will be interchangeable.

# 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.

# Uncomment the following line to disable colors in ls.

# Uncomment the following line to disable auto-setting terminal title.

# Uncomment the following line to enable command auto-correction.

# 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)

# 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.

# 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 nodenv zsh-autosuggestions zsh-syntax-highlighting)
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 x86_64"

# 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 the ZSH_CUSTOM folder.
# For a full list of active aliases, run `alias`.
# Example aliases
# alias zshconfig="mate ~/.zshrc"
# alias ohmyzsh="mate ~/.oh-my-zsh"

alias cls="clear"

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion


Hope you have a great time to do something with your Terminal. Make it so cool as you can do.
All right, see you in the next topic in the next time ^.^