Currently using zsh but I installed fish yesterday to try it out because I’m thinking of switching. All the zsh plugins I have are basically just replicating what fish has by default anyway and fish might do it better.
It still gives you basically no advantage compared to just making your terminal emulator launch fish by default. And well, it does give you the major disadvantage that scripts without shebang will fail.
The main differentiator of fish over everything else is it prioritizes intuitive behavior over backwards compatibility.
Zsh is to bash as c++ is to c. Most bash scripts and habits will work in zsh, but zsh is just more convenient and has more options. Fish is intentionally different.
Do I wish fish had existed instead of bash so we had a nicer terminal experience? On the whole, yes. But I also couldn’t be bothered to learn another shell where most of the instructions online won’t be able to help you, and I ended up sticking with zsh.
That isn’t incorrect, but it’s not as important as people make it out to be. Linux isn’t certified as POSIX-conformant either.
People are way too stuck on POSIX regarding Fish specifically, but in shell scripting, POSIX compliance boils down to “can it run a pure sh script”. Bash is compliant. Zsh is partially compliant and needs to set an option to emulate sh. Fish uses a different syntax and is not compliant; if that is a problem, don’t execute sh scripts in Fish.
POSIX compliance for shell scripts was important in the 80s and 90s when the #! directive wasn’t as commonly implemented and every script might be executed by the user’s $SHELL instead. That is no longer the case as virtually every Unix-like system’s program loader supports #!.
It’s a cool shell, I use it as a daily driver (though I’m keeping a close eye on elvish which syntactically is even further away from classic shell), but the comments read like fish is basically zsh. And while zsh is pretty close to bash, fish isn’t.
This is a good way of putting it. It’s essentially ZSH with Autosuggest/complete and a theming agent. At least visual-wise.
When you get into the scripting and the hot keys aspect of it, they reinvent the wheel and everything is different., Like for example ,!! and other bangs(I think that’s the right word?) like that are not valid on fish, And everything to do with variables is different from adding to your path to setting variables to creating functions. Also checking your error code is going to be different as well as it doesn’t follow the $x style inputs and doesn’t support IFS and globbing works differently.
TLDR; fish is nice, but If you use it unless you want to relearn an entire type of language, keep your scripts on bash or zsh
or if you wanna see the bigger differences fish has a dedicated bash transition page
I never managed to learn bash’s ways in my first decade of using it, learning fish a decade ago was easy by comparison. So much more human readable and sensible and consistent. Even though fish is the friendly interactive shell, I now use it for all my scripting too.
That was the exact opposite with fish. I had already gotten fairly well first with bash by the time I started using it, and the way fish did it was just super counterintuitive to me.
I couldn’t get into the overall design of how it looked and I disliked how command substitution and the built in’s worked, Combined with the fact that it’s a lesser used shell, so there’s less information available on it. I just couldn’t do it.
You brought up a point though. That makes me ask. You must not have to share your scripts with anyone then, right? Fish has a very small user base in comparison to ZSH and Bash and when I make a script that’s more advanced I tend to want to share it with my friends and having them install a whole new shell just to run a script is just not helpful to me. ZSH is close enough to bash in compatibility that, generally speaking, if I want to share it, I can use zsh And then convert the minor discrepancies. Where with fish I have to redo the entire script.
I don’t know why small user base is considered as meaning I must not have to share my scripts. Is it like an argumentum populum thing? [“If you build it they will come.” ;D]
[I suppose It’s true in a strict interpretation of those words… I don’t have to.]
I think I have several on my git repos. [… I have even written a text editor in fish.]
Free to use for anyone who wants to.
Also, if user base size is a concern, Fish’s user base is growing faster than Bash or ZSH.
Installing another shell seems a trivial matter to run something.
I install far bigger languages for far less all the time.
And conversion [if for some edge case reason you really need to ~ I know not why though] is generally trivial these days… just ask an LLM, if conversion scripts are lacking.
As for the less information about it… the online help’s really rather thorough and accessible.
I don’t know that quantity over quality would help. It didn’t for me and bash.
Unless I missed something, it seems to me that all that remains, is
I disliked
And that’s of course utterly fine. Free software’s defining point zero, the freedom to use software, includes the freedom to not use. Good to have multiple options to further facilitate that first freedom, catering to more variety of tastes.
argumentum populum would not apply here, since that one is based off populous opinion and I’m making the logical guess that since fish is the least used shell of the three we have talked about that it’s usage would be proportional as well. This might not be the case obviously which was why I was asking if you did share your scripts. Lack of usage was my biggest reason for bailing on it. I do a lot of script sharing with my friend group and I’m not wanting to have to do everything twice in order to be able to share it.
If you were looking for a argument from fallacy case, your best fallacy would be likely I believe appeal to probability, would be the close but not match as I am assuming most of your friends are not using fish, but I’m also basing it off the knowledge that it has a significantly smaller user base which makes it more likely. or possibly an illicit minor which would be the path of “My friends don’t use fish, so it’s unlikely that your friends use fish” which would potentially be valid, but again I am questioning the case not stating it as an exact, but since my initial question was based based off statistics and experience, I would go with the first one.
but back to the topic:
Documentation wise? I have read it. The examples are nice don’t get me wrong, but its layout needs work, the examples need better real world use cases and struggling to search for how to do something because the makers of the shell in their infinite wisdom decided to make a new keyword for something that was already stupid easy to use is just a hard pass for me (like I said I had already learned bash prior to this, whereas you had not learned bash). Not to mention with bash or zsh, I run into an issue I can just search the issue. What would take me 2 minutes to search for a problem with a script using zsh took me 10-15 minutes of research with fish and sometimes it wouldn’t even solve the issue at hand and required just rewriting it completely. Usually my path of research would require me to look up the issue using fish, find no solution so look up the issue using bash, then have to convert it to fish. Sometimes the issue would work fully in bash, and just not in fish. I came to the conclusion that if I was having to convert parts of it to bash anyway in order to research issues with it, I might as well do it in bash to begin with.
I agree with you, the more people using it the more examples and documentation will be available as a result, but I’m not going to be a spearhead for it, I don’t want to have to exert more energy than necessary, and I found the gains I got using fish didn’t outweigh the losses. Like I said I might revisit the shell some day, maybe if it ever becomes super popular, but for now I have removed it and ported my scripts back to bash again.
ammendum: btw LLM’s do not like fish shell for bash to fish conversion. I had tried it a handful of times resolving an issue (deepseek had the most success of them) but it was almost always a try 3 or 4 times, get something that has nothing to do with it, or uses something that fish shell doesn’t support, and then have to clear the context or find another path for resolution.
ammendum2: also fair warning, the last 2 topics on fish shell that appeared in this community got nuked after 2 days, so it’s possible this entire thread will disappear as well(hopefully not but it seems to be a reoccurring issue).
# if interactive, launch fish
[[ $- != *i* ]] && return || fish
and
alias f='fish'
So fish is my default, and if I ever need bash, it’s already there underneath, just a Ctrl-d keybind away to fall back on, and if I want to get back into fish, it’s just a f & RETURN away.
Seems better to have all the convenience of fish up front. All the completion magic. I so rarely have to type much at all.
Can cause issues (with things that expect bash or other nearer POSIX compliant shells as the system shell).
And then I’d lose those other benefits described, like having bash just a keybind away.
[Edit: I could have swore I got that interactive check in bashrc thing from https://fishshell.com/docs/current/faq.html or other documentation on fishshell.com, but, seems not. Can’t find it even in older copies. Not sure where I picked up that idea from then. Plausibly from someone on irc. I was sure I got that as official advice from fish… which I’ve been using and doing that method with since around 2014.]
I have that occasionally when I want to copy a complex bash command from somewhere. But yeah, I can then just run bash, run the command in there and then exit back out of there.
But well, I was rather thinking of when it’s using Bash-scripting-syntax to combine multiple commands.
Like, maybe there’s a for-loop in there. You just can’t paste that directly into Fish and have it work. Granted, you should probably put that into a script file, even if you’re using Bash, but yeah, just temporarily launching bash is also an option.
I jumped from bash to fish because cachy os has it as default. I kinda don’t like it, it’s a little too fancy, but it’s not bad enough for me to bother switching the default to bash. So I’m using it. Still not quite liking it but maybe it’s growing on me.
This is bait.
And I’m ready to
fishCurrently using
zshbut I installedfishyesterday to try it out because I’m thinking of switching. All thezshplugins I have are basically just replicating whatfishhas by default anyway and fish might do it better.Plus, look at your name!
The other way around, fish was implemented with the most popular zsh plugins in mind.
Six and two threes
Just whatever you do, don’t
ln -s /bin/fish /bin/shWell a shell script that can only run with Nash should include !# bin bash in the header.
You assume everyone writes shebangs correctly. Also ideally you’d use
#!/usr/bin/env bashI see.
Proceed to write
#!/bin/env bashIt still gives you basically no advantage compared to just making your terminal emulator launch
fishby default. And well, it does give you the major disadvantage that scripts without shebang will fail.what’s fish got? I’m liking zsh here but am always open to a distraction instead of getting work done. :)
Lovely OOTB defaults. I basically change nothing except the theme.
Autocomplete, git context, etc. The QOL stuff you’d expect.
oh interesting. will give it a shot. basically sounds like zsh plus omz?
The main differentiator of fish over everything else is it prioritizes intuitive behavior over backwards compatibility.
Zsh is to bash as c++ is to c. Most bash scripts and habits will work in zsh, but zsh is just more convenient and has more options. Fish is intentionally different.
Do I wish fish had existed instead of bash so we had a nicer terminal experience? On the whole, yes. But I also couldn’t be bothered to learn another shell where most of the instructions online won’t be able to help you, and I ended up sticking with zsh.
Be aware that fish isn’t a POSIX-compatible shell enough, so you have to adjust syntax.
That isn’t incorrect, but it’s not as important as people make it out to be. Linux isn’t certified as POSIX-conformant either.
People are way too stuck on POSIX regarding Fish specifically, but in shell scripting, POSIX compliance boils down to “can it run a pure
shscript”. Bash is compliant. Zsh is partially compliant and needs to set an option to emulatesh. Fish uses a different syntax and is not compliant; if that is a problem, don’t executeshscripts in Fish.POSIX compliance for shell scripts was important in the 80s and 90s when the
#!directive wasn’t as commonly implemented and every script might be executed by the user’s$SHELLinstead. That is no longer the case as virtually every Unix-like system’s program loader supports#!.I use fish, but sometimes it acts weird. And lots of “just copy and past this command” kind of online solutions I have to put into bash.
My main irk is when I want to forward a ‘*’ to a program but have to escape it.
That’s why it’s a shell for the 90s and not the 80s
It’s a cool shell, I use it as a daily driver (though I’m keeping a close eye on elvish which syntactically is even further away from classic shell), but the comments read like fish is basically zsh. And while zsh is pretty close to bash, fish isn’t.
This is a good way of putting it. It’s essentially ZSH with Autosuggest/complete and a theming agent. At least visual-wise.
When you get into the scripting and the hot keys aspect of it, they reinvent the wheel and everything is different., Like for example ,!! and other bangs(I think that’s the right word?) like that are not valid on fish, And everything to do with variables is different from adding to your path to setting variables to creating functions. Also checking your error code is going to be different as well as it doesn’t follow the $x style inputs and doesn’t support IFS and globbing works differently.
TLDR; fish is nice, but If you use it unless you want to relearn an entire type of language, keep your scripts on bash or zsh
or if you wanna see the bigger differences fish has a dedicated bash transition page
I never managed to learn bash’s ways in my first decade of using it, learning fish a decade ago was easy by comparison. So much more human readable and sensible and consistent. Even though fish is the friendly interactive shell, I now use it for all my scripting too.
That was the exact opposite with fish. I had already gotten fairly well first with bash by the time I started using it, and the way fish did it was just super counterintuitive to me.
I couldn’t get into the overall design of how it looked and I disliked how command substitution and the built in’s worked, Combined with the fact that it’s a lesser used shell, so there’s less information available on it. I just couldn’t do it.
You brought up a point though. That makes me ask. You must not have to share your scripts with anyone then, right? Fish has a very small user base in comparison to ZSH and Bash and when I make a script that’s more advanced I tend to want to share it with my friends and having them install a whole new shell just to run a script is just not helpful to me. ZSH is close enough to bash in compatibility that, generally speaking, if I want to share it, I can use zsh And then convert the minor discrepancies. Where with fish I have to redo the entire script.
I don’t know why small user base is considered as meaning I must not have to share my scripts. Is it like an argumentum populum thing? [“If you build it they will come.” ;D]
[I suppose It’s true in a strict interpretation of those words… I don’t have to.]
I think I have several on my git repos. [… I have even written a text editor in fish.]
Free to use for anyone who wants to.
Also, if user base size is a concern, Fish’s user base is growing faster than Bash or ZSH.
Installing another shell seems a trivial matter to run something.
I install far bigger languages for far less all the time.
And conversion [if for some edge case reason you really need to ~ I know not why though] is generally trivial these days… just ask an LLM, if conversion scripts are lacking.
As for the less information about it… the online help’s really rather thorough and accessible.
I don’t know that quantity over quality would help. It didn’t for me and bash.
Unless I missed something, it seems to me that all that remains, is
And that’s of course utterly fine. Free software’s defining point zero, the freedom to use software, includes the freedom to not use. Good to have multiple options to further facilitate that first freedom, catering to more variety of tastes.
argumentum populum would not apply here, since that one is based off populous opinion and I’m making the logical guess that since fish is the least used shell of the three we have talked about that it’s usage would be proportional as well. This might not be the case obviously which was why I was asking if you did share your scripts. Lack of usage was my biggest reason for bailing on it. I do a lot of script sharing with my friend group and I’m not wanting to have to do everything twice in order to be able to share it.
If you were looking for a argument from fallacy case, your best fallacy would be likely I believe appeal to probability, would be the close but not match as I am assuming most of your friends are not using fish, but I’m also basing it off the knowledge that it has a significantly smaller user base which makes it more likely. or possibly an illicit minor which would be the path of “My friends don’t use fish, so it’s unlikely that your friends use fish” which would potentially be valid, but again I am questioning the case not stating it as an exact, but since my initial question was based based off statistics and experience, I would go with the first one.
but back to the topic:
Documentation wise? I have read it. The examples are nice don’t get me wrong, but its layout needs work, the examples need better real world use cases and struggling to search for how to do something because the makers of the shell in their infinite wisdom decided to make a new keyword for something that was already stupid easy to use is just a hard pass for me (like I said I had already learned bash prior to this, whereas you had not learned bash). Not to mention with bash or zsh, I run into an issue I can just search the issue. What would take me 2 minutes to search for a problem with a script using zsh took me 10-15 minutes of research with fish and sometimes it wouldn’t even solve the issue at hand and required just rewriting it completely. Usually my path of research would require me to look up the issue using fish, find no solution so look up the issue using bash, then have to convert it to fish. Sometimes the issue would work fully in bash, and just not in fish. I came to the conclusion that if I was having to convert parts of it to bash anyway in order to research issues with it, I might as well do it in bash to begin with.
I agree with you, the more people using it the more examples and documentation will be available as a result, but I’m not going to be a spearhead for it, I don’t want to have to exert more energy than necessary, and I found the gains I got using fish didn’t outweigh the losses. Like I said I might revisit the shell some day, maybe if it ever becomes super popular, but for now I have removed it and ported my scripts back to bash again.
ammendum: btw LLM’s do not like fish shell for bash to fish conversion. I had tried it a handful of times resolving an issue (deepseek had the most success of them) but it was almost always a try 3 or 4 times, get something that has nothing to do with it, or uses something that fish shell doesn’t support, and then have to clear the context or find another path for resolution.
ammendum2: also fair warning, the last 2 topics on fish shell that appeared in this community got nuked after 2 days, so it’s possible this entire thread will disappear as well(hopefully not but it seems to be a reoccurring issue).
thanks for the detail!!
Yup, very similar! And quite customizable as well if you want to. But the focus is on having, by default, a friendly interactive shell.
I like that I can spin up a VM, install fish,
chshand I’m all set.does fish have fuzzy reverse hostory search?
Looks like that is indeed the default option
It’s time for a
nushellFish is great if you can’t remember a specific command, or don’t want to type out long filenames/locations, but I dunno if I’d use it as the default.
I just type “fish” in the terminal if I ever run into a situation where I might get some use from it.
in my ~/.bashrc
# if interactive, launch fish [[ $- != *i* ]] && return || fishand
alias f='fish'So fish is my default, and if I ever need bash, it’s already there underneath, just a Ctrl-d keybind away to fall back on, and if I want to get back into fish, it’s just a
f& RETURN away.Seems better to have all the convenience of fish up front. All the completion magic. I so rarely have to type much at all.
Why not just set it as the default then?
Can cause issues (with things that expect bash or other nearer POSIX compliant shells as the system shell).
And then I’d lose those other benefits described, like having bash just a keybind away.
[Edit: I could have swore I got that interactive check in bashrc thing from https://fishshell.com/docs/current/faq.html or other documentation on fishshell.com, but, seems not. Can’t find it even in older copies. Not sure where I picked up that idea from then. Plausibly from someone on irc. I was sure I got that as official advice from fish… which I’ve been using and doing that method with since around 2014.]
I used to do that, until I realized I never had a usecase for plain bash over fish
I have that occasionally when I want to copy a complex bash command from somewhere. But yeah, I can then just run
bash, run the command in there and thenexitback out of there.that’s what bass is for
I’m guessing, you mean this then: https://github.com/edc/bass
But well, I was rather thinking of when it’s using Bash-scripting-syntax to combine multiple commands.
Like, maybe there’s a for-loop in there. You just can’t paste that directly into Fish and have it work. Granted, you should probably put that into a script file, even if you’re using Bash, but yeah, just temporarily launching
bashis also an option.I jumped from bash to fish because cachy os has it as default. I kinda don’t like it, it’s a little too fancy, but it’s not bad enough for me to bother switching the default to bash. So I’m using it. Still not quite liking it but maybe it’s growing on me.