From ArchWiki
Jump to: navigation, search

fish (the friendly interactive shell) is a user friendly command line shell intended mostly for interactive use.


Install the fish package. Alternatively install the fish-gitAUR package for the development version.

To make fish the default shell, see Shell#Changing your default shell; however, you should consider #Not setting fish as default shell.

Once installed simply type fish to drop into the fish shell.

Documentation can be found by typing help from fish; it will be opened in a web browser. It is recommended to read at least the "Syntax overview" section, since fish's syntax is different from many other shells.


User configurations for fish are located at ~/.config/fish/ Adding commands or functions to the file will execute/define them when opening a terminal, similar to .bashrc.

Web interface

The fish prompt and terminal colors can be set with the interactive web interface:


Selected settings are written to your personal configuration file. You can also view defined functions and your history.

Command completion

fish can generate autocompletions from man pages. Completions are written to ~/.config/fish/generated_completions/ and can be generated by calling:


You can also define your own completions in ~/.config/fish/completions/. See /usr/share/fish/completions/ for a few examples.

Context-aware completions for Arch Linux-specific commands like pacman, pacman-key, makepkg, cower, pbget, pacmatic are built into fish, since the policy of the fish development is to include all the existent completions in the upstream tarball. The memory management is clever enough to avoid any negative impact on resources.


History substitution

Fish does not implement history substitution (e.g. sudo !!), and the fish developers have said that they do not plan to. Still, this is an essential piece of many users' workflow. Reddit user, crossroads1112, created a function that regains some of the functionality of history substitution and with another syntax. The function is on github and instructions are included as comments in it. There is a forked version that is closer to the original syntax and allows for command !! if you specify the command in the helper function.

Not setting fish as default shell

In Arch, some shell scripts are written for Bash and are not fully compatible with fish. Not setting fish as system wide or user default allows the Bash scripts to run on startup, ensures the environment variables are set correctly, and generally reduces the issues associated with using a non-Bash compatible terminal like fish. You may see some script errors if your default shell is set as fish. Below are several options for using fish without setting it as your default shell.

Modify .bashrc to drop into fish

Keep your default shell as Bash and simply add the line fish && exit to the appropriate Bash#Configuration files, such as .bashrc. This will allow Bash to properly source /etc/profile and all files in /etc/profile.d. When you exit fish you will seamlessly exit bash as well. Compared to the following options, this is the most universal solution, since it works both on a local machine and on an SSH server.

Use terminal emulator options

Another option is to open your terminal emulator with a command line option that executes fish. For most terminals this is the -e switch, so for example, to open gnome-terminal using fish, change your shortcut to use:

gnome-terminal -e fish

With LilyTerm and other light terminal emulators that do not support setting the shell it would look like this:

SHELL=/usr/bin/fish lilyterm

You can also set fish as the default shell for the terminal in the terminal's configuration or for a terminal profile if your terminal emulator has a profiles feature.

Whenever you open your terminal emulator, you will be dropped into fish.

Use terminal multiplexer options

To set fish as the shell started in tmux, put this into your ~/.tmux.conf:

set-option -g default-shell "/usr/bin/fish"

Whenever you run tmux, you will be dropped into fish.

Working with fish as default shell

If you decide to set fish as your default shell, you may find that you no longer have very much in your path. You can add a section to your ~/.config/fish/ file that will set your path correctly on login. This is much like .profile or .bash_profile as it is only executed for login shells.

if status --is-login
        set PATH $PATH /usr/bin /sbin

Note that this route requires you to manually add various other environment variables, such as $MOZ_PLUGIN_PATH. It is a huge amount of work to get a seamless experience with fish as your default shell using this method. A better idea would be to source /etc/profile and ~/.profile.

/etc/profile and ~/.profile compatibility

Since standard POSIX sh syntax is not compatible with fish, fish will not be able to source /etc/profile and thus all *.sh in /etc/profile.d) and ~/.profile. If you have fish as your default shell, you can work around this by doing the following:

Install dash and add this line to your

env -i HOME=$HOME dash -l -c printenv | sed -e '/PWD/d; /PATH/s/:/ /g;s/=/ /;s/^/set -x /' | source

an alternative variant will save you one executable invocation by using a builtin command:

env -i HOME=$HOME dash -l -c 'export -p' | sed -e "/PWD/d; /PATH/s/'//g;/PATH/s/:/ /g;s/=/ /;s/^export/set -x/" | source

Also consider #Not setting fish as default shell.

Tips and tricks

Disable greeting

By default, fish prints a greeting message at startup. To disable it, add set fish_greeting to your fish configuration file.

Make su launch fish

If su starts with Bash (because Bash is the default shell), define a function in your fish configuration file:

function su
    /bin/su --shell=/usr/bin/fish $argv

Start X at login

Add the following to the bottom of your ~/.config/fish/

# start X at login
if status --is-login
    if test -z "$DISPLAY" -a $XDG_VTNR -eq 1
        exec startx -- -keeptty

Use liquidprompt

Liquidprompt is a popular "full-featured & carefully designed adaptive prompt for Bash & Zsh" and has no plans to make it compatible with fish [1]. This project implements it for fish.

Note: See this issue for reasons why startx requires the -keeptty flag when using fish.

Put git status in prompt

If you would like fish to display the branch and dirty status when you are in a git directory, you can add the following to your ~/.config/fish/

# fish git prompt
set __fish_git_prompt_showdirtystate 'yes'
set __fish_git_prompt_showstashstate 'yes'
set __fish_git_prompt_showupstream 'yes'
set __fish_git_prompt_color_branch yellow

# Status Chars
set __fish_git_prompt_char_dirtystate '⚡'
set __fish_git_prompt_char_stagedstate '→'
set __fish_git_prompt_char_stashstate '↩'
set __fish_git_prompt_char_upstream_ahead '↑'
set __fish_git_prompt_char_upstream_behind '↓'
function fish_prompt
        set last_status $status
        set_color $fish_color_cwd
        printf '%s' (prompt_pwd)
        set_color normal
        printf '%s ' (__fish_git_prompt)
       set_color normal

Evaluate ssh-agent

In fish, eval (ssh-agent) generate errors due to how variables are set. To work around this, use the csh-style option -c:

 $ eval (ssh-agent -c)

See also