fish - the friendly interactive shell - is a smart and user-friendly command line shell for OS X, Linux, and the rest of the family. fish includes features like syntax highlighting, autosuggest-as-you-type, and fancy tab completions that just work, with no configuration required.
See the terminal emulator article for some general usage pointers.
fish is not a POSIX compatible shell, it will cause issues if set as a user's login shell. See caveats section for how to use fish as a user's default shell.
fish should not be set as the system shell by linking in /bin/sh. The eselect sh utility should not include a fish option.
emerge --ask app-shells/fish
In Gentoo, the login shell (the shell started after a user logs in, as defined in /etc/passwd) sources /etc/profile, which in turn sources /etc/profile.env. This is needed to set up a functioning Gentoo environment, so a working POSIX shell is essential (see login shell in Gentoo for details).
fish can not read these files, as it is not POSIX compatible, thus it is strongly advised not to set fish as the login shell for any user.
There is no reliable way to avoid this (see bug #545830), however there is a good workaround, as explained in the next section.
Those who nevertheless want to set fish as a default login shell can jump down to setting the fish shell as the login shell, though this is highly discouraged and can result in difficult issues.
fish as a default shell with bash as the login shell
The following workaround allows the use of fish by default, upon login or on starting a terminal emulator. This solution uses ~/.bashrc as a wrapper to have fish inherit the environment from the login shell, which is left as a bash.
Add the following to the user's ~/.bashrc, making sure it's placed below the test for an interactive shell, e.g. at the end of the file:
[...] # Use fish in place of bash # keep this line at the bottom of ~/.bashrc [ -x /bin/fish ] && SHELL=/bin/fish exec fish
When bash is started as an interactive shell, this will automatically launch fish for the user, once bash has fully initialized the correct system environment. It will also set the SHELL environment variable to
/bin/fish in fish.
Log into a new virtual console to test. Keeping open the current terminal may permit troubleshooting in case of issue with the new configuration.
When set up this way, launching an interactive bash prompt will drop to fish because of the line added to ~/.bashrc. To launch bash, ignore ~/.bashrc (beware that any commands in ~/.bashrc will not be executed):
bash --rcfile /etc/profile
fish as shell with bass to create and import environment
Once fish is installed, install bass, which will permit fish to source /etc/profile on startup. bass is a utility to execute commands in bash and replay the environment variable changes in fish. The bass site has instructions for different installation methods, such as with the fisher plugin manager or OMF. We will explain here how to install bass manually, as this is the most basic method, however a plugin manager is arguably preferable.
Move into or create a base directory for the bass repository, for example:
Clone the bass repository (requires git), and move into the repository directory:
user ~/.local/opt $
git clone https://github.com/edc/bass; cd bass
user ~/.local/opt/bass $
With bass, one can now have fish inherit the system-wide environment variables on startup, from bash.
Add the following line to ~/.config/fish/config.fish, above any other commands that would need the environment to be set up (config.fish may need to be created):
bass source /etc/profile
Finally, restart fish if it is already running.
Setting the fish shell as the login shell
After setting fish as the login shell there probably will be entries missing in the PATH variable and some packages that rely on /etc/profile.d will broken.
Those who really wish to make fish their login shell can still technically do so. This is not recommended and can result in a broken system:
chsh -s /bin/fish
fish starts by executing commands in ~/.config/fish/config.fish. The file can be created if it does not exist.
Since the version 2.0 it is possible to configure fish from a web browser session by running:
fish can generate completions from man pages. To generate completions run:
The handbook explains how to set environment variables globally, for all users, and for the default shell (bash).
Fish shell sets environment variables in a different way:
set -gx PATH "$PATH:$HOME/.local/bin:"
The output of a shell can, in some conditions, become corrupt. See the terminal emulator article for instructions to help fix this.
- Shell — command-line interpreter that offers a text-based interface to users.