Setting Up Fish Shell on Ubuntu Without the Fuss
Fish, the Friendly Interactive Shell, has quietly become the terminal of choice for people who want a smarter command line without spending a weekend tweaking config files. On Ubuntu, it slots in alongside Bash and Zsh without drama, and once you've tried its auto-suggestions and inline highlighting, going back to the old prompt feels a bit like stepping off a NBN FTTC connection and back onto dial-up. For Linux newcomers and seasoned admins alike, Fish is one of those rare pieces of software that delivers more than it promises.
This guide walks through installing Fish on a current Ubuntu desktop or server, customising it to feel like home, and setting it as the default shell. The steps assume a vanilla install of Ubuntu 24.04 LTS, but they translate cleanly to 22.04 and the upcoming 25.04 release. Along the way, you'll find the occasional nod to local conditions for readers working from a sunny back office in Perth or a chilly study in Hobart, because the Australian way of working - flex hours, remote setups, and the odd knock-off early when the cricket is on - shapes how we use our machines as much as anywhere else.
What Fish Does Differently From Bash
At its core, Fish is still a shell: you type commands, it runs them. The difference is in how it treats you while you type. Auto-suggestions appear in a soft grey as you start a command, pulled from your history and the system path, so the second time you type sudo apt update you only need to type sud and hit the right arrow. Syntax colours the command line as you write, flagging broken pipes and unmatched brackets before you press enter. Tab completion expands to show not just filenames but git branches, man page sections, and the contents of variables, with a small description next to each option.
These features sound small on paper, but they change the rhythm of working at a terminal. For a sysadmin juggling fifteen windows from a home desk in Brisbane, or a hobbyist running a Plex box out of a wardrobe in Adelaide, shaving a second off every command adds up. Fish also ships with a web-based configurator at fish_config that lets you pick colours, prompts, and functions from a browser tab, which is the kind of polish you'd expect from a paid IDE rather than a free shell.
Installing Fish on Ubuntu
Fish lives in the universe repositories, so installation is a single apt command. Open a terminal and run sudo apt update followed by sudo apt install fish, and that's the entire process on a standard Ubuntu desktop. Once it finishes, launch Fish from your current terminal by typing fish and pressing enter. Nothing else changes - your existing Bash sessions keep working, your scripts in ~/bin keep running under Bash, and your .bashrc keeps its aliases. Fish looks for its own config file at ~/.config/fish/config.fish and creates one automatically the first time you save a setting.
If you're working on a fresh box, say a Raspberry Pi you just finished setting up following the UbuntuNext walkthrough to install Ubuntu 24.04 LTS on a Raspberry Pi 5, the same apt command is all you need. The package pulls in a small set of runtime dependencies and registers Fish as a valid login shell, which becomes important later when you decide to make it your default.
Getting Around the Fish Command Line
Spend ten minutes with Fish and the workflow reveals itself. Pressing the right arrow accepts the grey auto-suggestion in full. Pressing Alt and the right arrow accepts it one word at a time, which is useful for long paths like /var/log/apache2/access.log. Up and down arrows search through history for anything matching the current line, so you can type git and tap up to cycle through every git command you've ever run.
Variables live in a different syntax that catches Bash users out at first. Instead of export PATH=$PATH:/opt/local/bin, Fish uses fish_add_path /opt/local/bin, which appends to the path for the current session and persists it across reboots. Aliases are replaced by functions, which are written like tiny scripts and saved to ~/.config/fish/functions/. The same approach scales up - serious users keep dozens of small functions for things like jumping to project directories, opening config files in their editor of choice, or connecting to a remote dev box over a ~/.ssh/config alias. For a developer in Melbourne's inner north running the same five commands fifty times a day, that customisation is where Fish starts paying for itself.
Making Fish Look and Feel Like Yours
Out of the box, Fish's prompt is functional but plain. The fish_config command opens a browser tab with a picker for prompt themes, colour schemes, and a list of available functions. Pick "Informative" for a clean two-line prompt with the current git branch, or "Agnoster" for something a bit more colourful. Changes apply the moment you save them - no logout required.
For a more permanent setup, edit ~/.config/fish/config.fish directly. The file is plain text and uses the same syntax as the shell, so anything you'd type at the prompt works in the file. A common starting point sets a preferred editor, points at a couple of personal binary directories, and exports the path:
set -gx EDITOR nano
set -gx BROWSER firefox
fish_add_path ~/bin
fish_add_path ~/.cargo/bin
The -gx flag on set exports the variable to any child processes, which matters for things like EDITOR and PATH. If you're running Fish on a laptop that doubles as a couch-surfing entertainment machine during a Sunday arvo session, you'll also want to keep the path additions tidy so a quick echo $PATH still reads sensibly. Australians working from home tend to be picky about fonts, and Fish supports any TrueType font your terminal can render. A few favourites in the local community are JetBrains Mono for its clear ligatures, Hack for its readability on small laptop screens, and Ubuntu Mono for that native feel. Drop the font into ~/.local/share/fonts, run fc-cache -fv, and pick it in your terminal's preferences.
Plugins, Themes, and a Touch of Oh My Fish
Fish has a small but lively plugin ecosystem, most of it packaged through the Fisher package manager. To install Fisher, paste the one-liner from the project's README into a Fish session. From there, a few plugins make a noticeable difference to everyday work. fzf integration gives you fuzzy file and history search with a Ctrl-R shortcut, z for Fish learns the directories you visit and lets you jump to them with a partial name, and the done plugin sends a desktop notification when a long-running command finishes, which is handy when you're kicking off a build and stepping out to grab a flat white from the local cafe.
Themes work the same way. tide is the modern successor to the older bobthefish and oh-my-fish ecosystems. Run tide configure afterwards to walk through five quick questions about prompt style, icon set, and colours. The result is a prompt that fits your terminal theme without clashing with a dark GTK desktop - useful when you're switching between a docked workstation in Sydney and a smaller screen at a mate's place in Byron Bay for the long weekend.
The "anywhere access" angle matters more than it sounds, because a lot of the convenience people chase online comes from being able to do things from any device at any time. The same principle shows up in services built around the pays anywhere online casino idea, where flexibility is the product. Fish captures a slice of that for the terminal: once it's tuned to your habits, you can do real work from any device that can reach your box over SSH, without the friction of remembering obscure flags or typing the same long path for the hundredth time.
Switching the Default Shell and Avoiding Common Traps
When you're ready to make Fish your login shell, run chsh -s /usr/bin/fish from any terminal session. Log out and back in, and your terminal will start in Fish instead of Bash. The change is reversible at any time with chsh -s /bin/bash, so there's no risk of locking yourself out.
Two traps catch people out. The first is that some scripts in ~/.bashrc or system-wide /etc/profile.d files assume Bash and will throw errors when sourced by Fish. The fix is to guard those blocks with a shebang line or move the logic into a dedicated config.fish. The second is that programs calling /bin/sh (which is usually Dash on Ubuntu) won't be affected - they keep using POSIX syntax. Keep a Bash subshell handy with bash -c "command" for any one-liner that needs the older syntax, and consider a tiny function that just runs bash -i for interactive fallback.
A handful of Linux tools from the wider ecosystem - notably anything that spawns an interactive shell, like sudo -i or some IDE plugins - read /etc/passwd to decide which shell to launch. Because Fish is registered as a valid shell during the apt install, those tools pick it up automatically. If you ever see a tool that refuses to launch Fish, check /etc/shells to make sure /usr/bin/fish is listed.
For Australian readers working in hot conditions - a study in Darwin during the build-up, a warehouse office in western Sydney in February, or any sun-baked room where a laptop's fan sounds like a small jet - it's worth keeping an eye on CPU temperature when running heavy shell scripts. Fish itself is light, but a runaway find over a network share can pin a core. The htop package, installable with sudo apt install htop, gives a quick read on what every core is doing.
The friendly thing about Fish is that none of this is mandatory. You can install it, play with it for a week, and go back to Bash with no lasting changes. Or you can spend a Sunday afternoon turning it into a personalised command centre, write a handful of functions for the commands you actually run, and find that the terminal becomes a quieter, faster place to work. Keep bash on hand for scripts, treat Fish as your interactive companion, and the rest falls into place.