Switched and never came back. Always recommend people to use fish if they're not the "customize everything everywhere to my liking" type.
The defaults of fish are great and common tasks are simple. The for loop syntax was so intuitive I got it right the first time without checking Google (which I have to do every time I write a bash for loop).
> Always recommend people to use fish if they're not the "customize everything everywhere to my liking" type.
Fully agree. It feels like fish is the Apple of shells, in that regard. Unless you really love to tinker with your shell, the great defaults and great UX make it really easy to recommend.
I find myself customizing fish way more than I ever did with Bash. Writing custom completions is easy and I find the scripting syntax a lot nicer. Combining the two is really powerful. Granted, fish ships with a ton of completions out of the box so you may not need to write your own.
It's not difficult to customize. IMO, it's actually easier to customize yourself than bash/zsh because I find the fish syntax much more natural than bash, but YMMV.
That said, I believe that zsh has a bigger community, and therefore most likely a richer ecosystem with more plugins. For example, oh-my-zsh has 142k stars, and oh-my-fish has 8k stars.
However, even with the rich ecosystem of plugins, I wasn't able to get my zsh to be as pleasant to use as my fish, where I only have some self-made customizations (not even using oh-my-fish).
But if having lots of plugins to choose from is important to you, zsh may be a better choice.
I'm a previous bash user who now uses fish and loves to customize everything, and compared to bash, customizing fish is a joy. Its so much easier to do, using oh-my-fish brings a great selection of plugins (admittedly lots of them are inspired or clones of oh-my-zsh plugins) and writing plugins is a breeze as well.
Switched and came back after about 3 years (to zsh).
Fish is nice in many ways, but it kinda lives up to its "A command line for the 90's" slogan. It's better than what came before it, but I'm not sure it's better enough. Using a non-POSIX shell can feel like death by 1000 cuts sometimes, and I wasn't sure the benefits of Fish were worth the cost. Also, scripting feels like a bit of an afterthought in Fish and that's a very important part of a shell to me.
These days I'm feeling optimistic about Nushell; it's not quite ready for most people to use as a daily driver, but it's getting there and it has a much stronger value proposition than Fish.
I’m a long term bash user, I tried fish and just couldn’t get used to it (death by 1000 cuts is a great way to put it.) I’ve recently settled on zsh but I still prefer bash’s basic history (e.g. just pressing up without typing any command)
By default it’s iffy. I’m sure you can configure it to match bash but if I open a shell, spawn a service (e.g. run a typescript backend,) do some work in another terminal and come back the command I get when just pressing up is different. It’s such a small thing that I’ve stuck with zsh regardless, and command completion is worth so much more to me, but I still consider it a nice to have to figure out one day.
My other was similar: bash, zsh, fish, back to zsh. The ecosystem around zsh is just so much more robust. Fish is better out of the box than zsh, but once you start customizing fish loses its shine.
I tried bash first, with every bell and whistle added. I tried all the scripts and tuned my .bashrc and .bash_profile and PS1 and all the crap. It was a huge chore.
Then I tried switching to zsh with oh-my-zsh and all that. 42 million tunable bits and I still didn't get it to my liking.
Then I found Fish and 95% of the stuff was good enough out of the box. The only things I've really added was Starship[0] as a prompt - again good enough with pretty much zero configuration and fzf[1] for history search.
Now I use it everywhere, synced via Homeshick[2]
I still use bash to write shell scripts that aren't long enough to be converted to Python though.
I switched to fish about 7 years ago and never looked back. It feels so much more natural to use than bash. With all the hype (and better ecosystem) of zsh, I once genuinely tried using zsh, but eventually came crawling back to fish.
Using just plain bash seems so foreign to me. Having no FZF command history search or intelligent auto-completion would kill my productivity. I'd say it's as essential to my workflow as tmux.
The only major downside of fish, in my experience, is the incompatibility with bash scripts. Sometimes it's a hassle to rewrite those to be fish-compliant. But honestly, this is something I run into once in a blue moon. On the flip side, the simple fish syntax really encourages me to write my own fish functions, whereas with bash I was always dreading writing bash scripts.
Personally, I can fully recommend fish. In my experience, switching to it is not even painful at all, not like vim which took me quite some dedication to get through the learning curve (switched from Sublime Text).
~30 year bash/sh user here (glossing over the regrettable, mercifully brief dalliances with csh and ksh). I can’t claim to be long suffering, because I (still) enjoy using bash.
In December just gone I gave up on macOS after 17 years and switched to Linux. Thought I’d take the opportunity to try a new shell and went for fish (though I still use bash on certain remote hosts for a variety of reasons).
autocomplete and colours/highlighting are more than enough to keep me using it. I really enjoy them. But…
I don’t yet love how history works. Four months in, I still can’t get used to not having ctrl-r.
I miss the symmetry of `do … done` in loop syntax, finding `for … end` jarring.
The lack of !! really grates sometimes. I was going to say I miss `^x^y` last command modification, but actually I can’t recall trying it since switching.
`VAR=x cmd …` doesn’t seem to work quite how I expect. I have an alias/function to perform SSO login to AWS, which expands to `BROWSER=otherfunc aws sso login` - otherfunc itself expanding to `firefox -P workprofile`. This stubbornly opens a Firefox tab in some random window, regardless of profile - despite otherfunc on its own always working. I did not, IIRC, have this trouble with bash.
> I don’t yet love how history works. Four months in, I still can’t get used to not having ctrl-r.
I think it's worth getting used to but there are plugins like fzf that implement ctrl-r
> `BROWSER=otherfunc aws sso login`
Aliases/functions are generally not visible in child processes.
I guess it worked if the "aws" tool invoked BROWSER via a bash process that either sources aliases from a bashrc, or reads exported functions ("export -f otherfunc").
It would work for fish too if "aws" invoked BROWSER via fish (though fish doesn't need exporting, since functions are also loaded in non-interactive shells).
I recommend that you make otherfunc a script, then it will work everywhere (also with arbitrary wrappers like strace, gdb).
Just try it for a couple weeks. I bet you won't go back to bash except for writing bash scripts for work :) . Even the defaults without changing anything are so awesome. I always ad a simple theme "ays" and "fzf" and not much else. I like to keep it simple, but fish has so many built ins it's awesome. Honestly I don't use it for scripting though just CLI, the only scripting I do is to support CLI capabilities. I do use the ubuntu PPA though, the ubuntu 20.04 default version of fish is quite old.
I have used fish for so many years I have lost track. Maybe 10 years. Occasionally I need bash and then I just launch a bash shell. But I have gotten fish to work with pretty much everything I need without problems whether prompts or Python environments.
Fish excels as an everyday interactive shell. I never program shell scripts. I write Julia code whenever something equivalent of a shell script is needed. Before that I often used Go.
I've been using Fish for years and spend my entire day working with Python. Python's virtualenv has an `activate.fish` command, I've never had any problems with it. Additionally, we have a ton of internal tooling built in a fabfile, so I've written a couple of snippets of fish that automatically activate that .venv (Poetry managed) whenever I cd into a directory that has one, and also expands a bunch of env vars into the shell session. I've also got this feature request in on the virtualenv repo in the hope that one day we can have activate.fish emit an event - https://github.com/pypa/virtualenv/issues/1456
The defaults of fish are great and common tasks are simple. The for loop syntax was so intuitive I got it right the first time without checking Google (which I have to do every time I write a bash for loop).
Not much more to say I think.