Fishy fun
I love fish shell.
The syntax is simple and consistent, and the behaviour straightforward and predictable. There are comparatively little magical symbols, and there are no real "gotchas" or ways to screw yourself over.
fish
has autocomplete and history search that just works. I can type something and press tab, or press the up arrow, and it just works. It's night-and-day compared to bash
. Any time I'm unfortunate enough to ssh
in to a machine that defaults to bash
, I sit there mashing the tab
key, only for nothing to happen.
I've never once had to "configure" fish
. It just works out-of-the-box. It was designed to be useful and optimal from the start.
Configuration is what happens when you have a bad design, and you are either too obstinate to admit to your mistake, or too deficient in essential virtues to acknowledge that there exists a gradient from bad things to good. Either way, you double down on the mistake, and demand users "configure". At the moment you are creating configuration opportunities, two things have gone wrong. Reliance on configuration is cowardice.
Why not just make it work out of the box?
There's no one in a better position to do this "configuration" than the programmer himself, at the time the program is being written. Why be so rude to your users that they must either put up with the bad behaviour, or invest time in to fixing it?
As the user, what you need to do to fix the machine isn't even novel. Everyone else needs to do the same thing. How much time is collectively wasted?
It's not a gift that you have the superficial ability to fix the machine's poor initial behaviour, if it comes at the expense of your own time and effort. Configuration has not put you in control. Quite the opposite.
Supporting the additional behavioural modes also brings complexities for the codebase itself. It's harder to maintain, and brings about more bugs. It's a vicious cycle: the more configuration you demand, the harder it is to change any defaults, because it breaks people's configurations. The codebase quickly becomes sclerotic.
Caution, the configurater
Many human lives have been forfeit to "configuration".
My uncle got lost in his zsh
profile and died.
I've exclusively been a fish
user for half a decade, and the only things I've ever modified in my fish
profile are PATH
, and a handful of aliases.
On the other hand, the rabbit hole of zsh
configuration is so large that people triple-down and create meta-configurators to configure their configurations. Not once did anyone stop and realise that they are stuck in a local optimum.
We'll never get these people out again. What a waste!
Works, wonderously
fish
wants nothing from you, but gives everything in return.
It doesn't tell me that directories are directories:
bash-3.2$ /foo/
bash: /foo/: is a directory
It doesn't tell me it doesn't have permission:
shire@shire ~ % /foo/
zsh: permission denied: /foo/
It just works:
shire@shire ~> /foo/
shire@shire /foo/>
If I type something incorrect, it doesn't warn me that the file isn't infinitely long:
if [[ -f "foo" ]]; then
echo bar
else
echo baz
bash.sh: line 5: syntax error: unexpected end of file
Instead, it simply points out the problem:
if test -f "foo"
echo bar
else
echo baz
fish.fish (line 1): Missing end to balance this if statement
if test -f "foo"
^^
Complexity, perplexity
The complete reference manual for bash is 486,971 characters long.
The complete reference manual for zsh is 1,332,241 characters long.
The complete reference manual for fish is 94,364 characters long.
What does this all get us? Is bash five times more expressive than fish? Five times more performant? Five times more powerful? Five times more featureful? Clearly not. So, what exactly are we getting for five times more complexity?
And is zsh fourteen times better?
What can be done about this?
hashtag #make_fish_the_default_shell_in_{$current_year}