Initially I wanted to make this series to reflect:

  • the first few days;
  • the first few weeks;
  • the first few months;
  • after maybe a year or so.

… as you can see it did not work out. That is by no means Fish’s fault though, but with the lack of time on my end.

In any case, it has been quite some time – 5 years! – since I picked up Fish as my primary shell and so high time I share my experience so far.

Past issues resolved

In my previous blog post I listed some issues that I ran into.

I am happy to report that in these years basically all of them (and any new ones I encountered) have been fixed.

One big thing issue I had previously was Fish requires a web browser for both its help (through help) and its settings (through fish_config).

For help files Lynx (or any other text-only browser) is perfectly enough.

And fish_config has since been expanded, so you can use it from the command line. Check fish_config --help to see settings are supported.

In 3.3.0 the following can be already done in the CLI, so you can now do everything in CLI that you could in the web UI:

  • change and preview prompts with fish_config prompt;
  • (changing and preview of themes with fish_config theme is already merged for 3.4.0);
  • search and modify history with history;
  • modify functions with funced;
  • change abbreviations with abbr, bindings with bind, and set variables with set.

(In)compatibility with Bash/POSIX

A well known drawback of Fish is that it is not 100% POSIX compliant. But apart from all my previous serious gripes going away already by simply updating Fish (currently 3.3.1) – apart from that globbing issue mentioned below – I have not run into any issues in a long long time.

And where you need compatibility with Bash, there is always Bass. Luckily the only time I had to rely on Bass at all was at work when I had to mess with NVM.

What I did notice in the past few years is that Fish became much more popular and many tools recognise it as a valid shell and take its quirks into account (as they did before with Bash and Zsh).

Tweaks and dotfiles

In my previous blog post I also mentioned Oh My Fish! and that my preference is to manually maintain all my tweaks in dotfiles.

This remains to be true and you can check them in my dotfiles repository.

For those who prefer using a shell-specific package manager for such tweaks, Oh My Fish! has grown tremendously and seems like a great resource and tool.

The biggest tweaks I made were:

  • set BobTheFish as my theme;
  • use LSD instead of ls --color if it is installed;
  • made tree by default go only 2 levels deep (and use lsd if exists);
  • implemented Peco to search through the shell history and processes to kill;
  • brought some colour to man.

There are also some (even) smaller tweaks – but what is important is that even someone like me, who had no formal programming training, is able to tweak and script his way around Fish.

Which neatly brings us to …


Fish is the first shell I am actually fairly comfortable scripting in.

Apart from the dotiles I have nothing truly complex to show, but at least nowadays I feel confident enough in the interactive shell that I do not fear to if and pipe my way around problems I encounter.

My only gripe now

Which brings me to the only gripe I currently have with Fish – some pattern matching that I would expect to work is currently missing.

Namely, I would expect the following to remove all files that start from a to f, but instead it just throws an error:

rm [a-f]*

There are some more examples, but the above one is the one that I care for the most ;).

Issues are open for this of course, if anyone wants to help out:


After five years, I have grown quite fond of Fish, and it is great to see it used and supported more widely.

At this stage I do not see any reason to try out any other shell. You can never know what the future may bring, so far it seems it is here to stay. At the very least on my computers …

hook <3 <><

_hook out → so long 2021 and _

Related Posts


Trying out Fish




Stay in Touch