The fish shell is amazing
rmpr.xyz
rmpr.xyz
I found that while fish has better syntax than bash for most things, the hassles with incompatibility or unexpected behavior brought me much more trouble than BASH's syntax ever has
Another random tip: python virtualenv generates a activate.fish script that you should use instead of the plain activate script.
It basically runs the script in bash, diffs the environment, and applies the environment changes to your outer fish shell. I use it for some internal tools, and previously used it for nvm though I moved from nvm to fnm now which has fish support.
The only thing I ever used bass for was this edge case where at work the way we login to AWS is using this Okta AWS integration that prints out a list of export commands.
Since fish isn’t compatible with bash export commands, I just run that command result through bass, which automatically converts them to the fish set -x commands.
If I remember right, I think the reason why the bash script my company made didn’t work is that the export commands that were run in bash weren’t propagated to the underlying fish environment. I was using fish to run a script with a separate shell, so it didn’t affect my environment variables.
Or maybe it was because running exec inside a bash script throws you back into fish which then can’t understand the export command.
I could have definitely done my own thing with sed/awk instead, but I suck at those tools and someone else already implemented the functionality in bass.
bass exec aws_okta_thing_that_prints_export_commands_to_stdout
(Off the top of my head, I think it was something like that, could be misremembering! And by this comment you might be able to tell that I’m far from an expert on how everything works.)Shebangs are actually handled by the operating system kernel! I only know this because certain kinds of shebangs work on Linux, but not on other OSes
Can you also share what are the most significant problems with posix incompatibility for you? Why is it a problem?
Internally we have a boot strap run book developers/operations to bring up either Windows/WSL or MacOS to a consistent shell env.
#!/usr/bin/env bash
which means the interactive environment is irrelevant. Users of nonstandard shells like fish need to learn a bit of on-the-fly translation if they expect to copy/paste into their terminals, but it isn't too onerous.MacOS has version 3.2.57(1) Ubuntu has version 5.0.17(1)
Apparently Apple cites license concerns as the reason for not upgrading it. Don't know how valid that is.
License on version 3.2.57 is GPLv2 License on version 5.0.17 is GPLv3+
It's simple enough to update if you use homebrew.
`brew install bash`
Add the brew version of bash to the /private/etc/shells and change the shell.
I’ve recent switched from vanilla bash to ZSH. I mainly use oh-my-zsh and Power10k. Once again the defaults without much customization.
I keep a personal fork with a few added plugins (most notably zsh-autosuggestions and ssh-agent). No need for a plugin manager.
oh-my-zsh is way too bloated. But it's a nice repo if you're looking for plugins and aliases.
autoload -Uz vcs_info
zstyle ':vcs_info:*' enable git hg
zstyle ':vcs_info:*' check-for-changes true
zstyle ':vcs_info:git*' formats "%{$fg[cyan]%}(%{$fg[green]%}%s %{$fg[blue]%}%r%{$fg[cyan]%}:%{$fg[green]%}%b%{$fg[yellow]%}%m%u%c%{$fg[cyan]%})%{$reset_color%} "
setopt prompt_subst
export PROMPT="%{$fg_bold[red]%}%n%{$reset_color$fg[white]%}@%{$fg_bold[green]%}%m%{$reset_color$fg[white]%}:%{$fg[cyan]%}%1~ \${vcs_info_msg_0_}%{$fg_bold[white]%}%(#.#.\$) %{$reset_color%}" set -l git_branch (git branch 2>/dev/null | sed -n '/\* /s///p')
if test -n "$git_branch"
echo -n -s (set_color yellow) "<$git_branch>" (set_color normal) " "
endThe fact that I can write a simple for loop without needing to look up how to do it by far beats the POSIX compatibility, if I need it I can still write a bash script, but when using the shell I don't need to recall where semicolons or `do`, brackets (and how many) go.
for i in $(seq 1 10)
do echo $i
done
Then you can just replace new lines with ; if writing a one liner. for i in $(seq 1 10); do echo $i; done
I guess it isn't as simple as python for i in range(10): print(i)
but it's pretty close aside from the variable binding. for i in {1..10} for i in {1..10}; echo $i
to me is as clear as the python version.
Very compact and useful for one liners.Did the same, but moved on.
Now it is: bash => zsh => fish => nu
I haven’t tweaked my shell config in 7 or 8 months now.
This is a different mindset from the giant zsh configs, “plugin managers” and other junk that is wholly irrelevant to using the shell. You’d think that fish incorporating a lot of functionality that zsh has would manifest as bloating fish, but, IMO the reality is that zsh’s “bloat” is pushed into user configuration and the user is tasked with making it work.
As for a replacement for oh-my-zsh itself, I had good experiences with zgen[1] but the fastest I've found is zim-fw[2] which produces acceptable start times for me[3].
[0] https://github.com/romkatv/powerlevel10k/
[1] https://github.com/tarjoilija/zgen
For example, to me, it is _insane_ that in 2021 async prompts are not a completely solved problem. The shell should provide a mechanism to do so easily, rather than duct-taping thin veneers over syscalls via a scripting language.
I've found that sometimes the opposite can be true (in a good way!). At one workplace, I introduced Fish to some fellow developers who until then mostly saw using the command line as a strange, difficult, and unpleasant part of their jobs.
Once I got them started with Fish, they were happy enough with default interactive behaviors, convenient documentation, and simple scripting syntax that it encouraged them to do a little more scripting, and eventually to customize some of the aesthetic stuff by writing custom prompts!
It was pretty cool to see.
This is such an incredibly odd perspective to me. I use zsh and have not touched my shell config in years. Messing with configurations to get things working to your liking is a one time thing. I don't even use plugins.
On the other hand, if fish doesn't work to your liking out of the box, and for many people it does not, there's no "messing with it" that's possible. You are forced to give up and use something else. Your reason to choose fish is only a good reason if you already agree with every minute choice the developers made and refuse to let you adjust.
What do you want to do that isn't possible? I also haven't messed with it in months if not more (fish in my case, not zsh) but years ago I messed with the prompt a lot to get it to my liking. (From a previous zsh config.) It was perfectly possible.
Which part of fish makes this impossible? You can tweak the startup, the completions, the key bindings, the prompt, and so on.
I went through a "distro hopping" phase at some point with Linux and ended up settling on a system with very little custom config. It's close to the defaults so I can work very comfortably even in a random server.
Of course this is not ideal. If you have a tool or set of config that you like, then you should use it. I've just found that the human brain can overcome bad UX quite well with a little effort ;)
I use bash as my default user shell, fish as the default shell of my terminal emulator, and I write scripts for both POSIX sh (dash and busybox ash) and bash. I end up using three different shells with different purposes.
Sure, I could use zsh both as an interactive and scripting shell but I don't have the time or willingness to configure it when fish offers a nice out of the box experience. Not to mention that zsh shouldn't be used as a scripting shell in the first place.
Why not? If I'm writing scripts for automating configuration on modern macOS, for example, where ZSH is installed by default, why not write ZSH scripts?
I know what you mean, though. Most shell languages don't feel like flexible, expressive programming languages in the way that they ought to and could.
As you may know, there are some new shells/languages that are trying to bridge the gap in a way that still leaves the shell well-suited to interactive use. The Oil shell wiki has a great list of them (and Oil is one such shell itself, of course): https://github.com/oilshell/oil/wiki/Alternative-Shells
Perl's actually pretty good here; I'm pretty new to it, but it's generally what I reach for when I feel like a bash script has gotten just a bit too complicated.
If all you're doing is `a | b | c | d` then use bash but if you're pulling stuff out of the middle in a loop, yeah, might want to use a real language.
I guess there are two reasons
- if the script doesn't need arrays, POSIX sh (dash) scripts will be much faster than bash/zsh scripts
- if you do need arrays, bash is vastly more ubiquitous than any other shell on the planet right now (except POSIX sh). It's installed on almost all Linux distributions by default. I'm not gonna use a ZSH script because I'd have to install ZSH, which seems unnecessary. A good example is tomb, which is a ZSH script for encryption on Linux.
If you're sure that your scripts will always run on macOS, use POSIX sh if you don't need arrays and ZSH if you do need them.
I script in bash (though I'm super interested in oil), and use fish as my interactive shell, it's pinned to screen 0 in my screen session.
I don't write shell scripts a lot, I prefer to write python scripts (that are more maintainable and simple to write). But I write complex commands in the shell a lot, for example I may need to convert a bunch of images from one format to another, just use a for loop with imagemagik directly from the command line, then maybe a regex with sed to rename them, and done. It's not rare that I write commands that are more than 5 lines long.
With all the quirks of POSIX shell scripting languages (well in reality I use zsh that is nicer) they let you hack things together fast, and that makes them powerful.
Why would I need do to that?
> But I write complex commands in the shell a lot ... It's not rare that I write commands that are more than 5 lines long.
Ah, well, yeah, in that case, you might wanna stick to ZSH. I don't write complex commands on the shell. If it's more than 1 line long, I will make it a script. Multiple lines of commands with, or without, backward slash separators look ugly and unwieldy to me. A text editor like vim would do a far better job handling those 5 lines instead of an interactive shell.
The more languages you know the more valuable you are. I prefer to only write golang but sometimes that leads to typescript, Makefiles and bash scripting as well.
such as?
# MacPorts Installer addition on 2016-07-01_at_00:46:04: adding an appropriate PATH variable for use with MacPorts.
export PATH="/opt/local/bin:/opt/local/sbin:$PATH"
# Finished adapting your PATH environment variable for use with MacPorts.
And I had to put the fish equivalent of that into ~/.config/fish/config.fish myself.You should keep using bash as your default login and user shell, define your environment variables, like PATH, in your `.bashrc`/`.bash_profile` but use fish as the default shell of your terminal emulator. In that case, fish should pick up the PATH from bash.
Unlike what some people may think, it's not just about the tool itself but its ecosystem as well.
I kind of forgot that even use it until I read your comment :)
Really nice shell though, I hope it gets more traction.
I hated Apple, but my opinion changed when I learned how to configure ZSH.
I’ve used fish as my shell for years and still have so far never written any shell scripts in fish. It may also be a nice scripting language, but I personally use it because it’s a fantastic interactive shell.
I think i'd be up for trying out a new shell for my command line, it's rare I use shell specific syntax heavily for one liners... unless I just don't know it yet.
bash foo.sh
Which is actually easier to type than
./foo.sh
Output redirection doesn't work right with Fish functions, which makes them unusable in certain kinds of scripts. Aside from that, though, Fish is perfectly pleasant for simple scripting. I use Fish for simple stuff and PowerShell for anything serious. Some day I'd like to use something like Elvish or Nushell for both, and use the same language as my interactive shell.
bash -c 'echo "hello"'
Replacing echo "hello" with your script.But:
1. I have CTRL+R bound to fuzzy reverse history search via fzf in my Fish config. It works great. It's fast, and it's way better than the built-in Bash reverse history search imo, even though it works basically the same way (it should feel very familiar). fzf itself comes with the keybindings, so you don't have to sort them out yourself; you can just source 'em: https://github.com/junegunn/fzf/blob/master/shell/key-bindin...
2. For one-off one liners you see in GitHub repos or something, if you really want tab completion and syntax highlighting and whatever, you can just use `exec` twice:
⋊> ~ echo $HELLO
⋊> ~ exec bash
~ $ export HELLO=hello
~ $ exec fish
Welcome to fish, the friendly interactive shell
⋊> ~ echo $HELLO
hello
3. If you want to import your handy one-liners from your existing `.bash_history`, you could try using babelfish to automatically translate them, then import them into your Fish history: https://github.com/bouk/babelfishIt may not work right for some of them, but it's worked on the scripts I've tried. You might also be able to bind a key that translates whatever command there is on the prompt into Fish. It seems to handle the basics well, including subshells with redirection/process substitution, e.g.:
~ $ cat <(echo hi)
hi
~ $ history | sed -E 's/^[[:space:]]+[[:digit:]]+[[:space:]]+//g' | grep -E '^cat' | tail -n1 | babelfish
cat (echo hi | psub)
~ $ fish
Welcome to fish, the friendly interactive shell
⋊> ~ cat (echo hi | psub)
hi
⋊> ~ exit
~ $
Babelfish is pretty fast. Maybe you could create a Fish keybind that searches through your bash history, only it's translated to Fish via babelfish? Then at least you could keep your existing history in a way :DI've used several dozen shells, script languages, and programming languages - and have needed to do within the context of a single job. What's one more? For an interactive shell I prioritize writeability, and for scripts I prioritize readability and maintainability. These are often at odds - not just in what I write, but in the syntax itself - and by making my shell and script the same, I make middling compromises resulting in a jack of all trades that is a master of none.
I disagree that this is "ideal".
> and you can begin to shape scripts out of your shell history.
It's been my experience that this is quite doable even when the scripting language has different syntax than your shell. Oh, sure, it's not as simple as Copy+Paste - but it's never that simple. Even simple shell scripts inevitably end up needing error checking, sanity checks, error messages, ...
bash
PASTE_HERE
exit
Works for everything unless the pasted commands set variables you want to use. echo "pwd: $(pwd)"
See https://github.com/fish-shell/fish-shell/pull/8059Beside very basic usage, a shell is really a REPL for a scripting language. You can type commands but also you can do most advanced things (and that is what makes shell powerful). For example I maybe have to convert all the video files in a directory, and then upload them to a server, I can easily do that with a for loop in the shell, without creating a script.
And since you use both the shell to type commands and to write effectively scripts as in a REPL, that means that you have to learn another completely different programming language, the fish language (of course I assume that you already know POSIX scripting), and not only that, it's probably the case that only on your computer you have fish but it's not installed on every other system, so when you are using another computer (a server, a computer of a coworker that you are helping, etc) you will make mistakes because you confuse the fish syntax with the one of POSIX shell.
Yes, it's true that bash extends POSIX, and zsh too and it's not even compatible 100% with bash, but the differences are in things that it's rare that you will use in a basic script, and all these shells can understand POSIX syntax. A for loop it's the same in sh, bash and zsh (there is a shorter syntax in zsh, but the base one is the same), while it's completely different in fish.
This is the reason, why I try to prevent using bash/zsh exclusive features in my daily use scripts.
I'm not sure I've ever opened my fish config file, but I'm still able to customize it easily
Though, I’m keeping a very interested eye on Nu shell. They’re doing a lot of stuff right, and I expect it will become a very useful scripting language in its own right even when not used full-time as a shell.
That's weird. Fish has all of the GNU readline shortcuts OOTB and has for as long as I can remember
I guess it does the PATH hacking based on whether the system is GNU or not so that it can get `realpath`/`readlink -f`-like behavior even on systems that don't natively have that because they include *BSD coreutils.
That might not behave as expected (and is unnecessary) on my macOS systems, either, since I like to keep GNU coreutils (with no `g` prefixes on the executable names) on my PATH there (heresy, I know).
It's also noticeably slower, to the point that there's a bit of jitter as I type.
It's pretty cool, though. If it's any better after I patch the readlink PATH hacking out, maybe I'll configure it for bash on my systems.
Also... the script will then run only on my machine as most Linux systems don't have powershell and most Windows don't have the Unix commands I still use all the time.
> Also... the script will then run only on my machine as most Linux systems don't have powershell and most Windows don't have the Unix commands I still use all the time.
Hahahaha! Oof.
It's more work, but when I use PowerShell, I try to use pure PowerShell, both for aesthetic reasons (cleanliness, ‘portability’) and just in order to practice and learn more PowerShell APIs along the way.
Now-If-They-Could-Improve the Syntax To-Make-It-Usable.
That said: what do you like about Nu shell specifically?
A whole bunch of things:
1. abandonment of POSIX shell syntax. We can do better. I'm happy with Zsh being POSIX-compatible, and that will always be there.
2. a focus on structured data. Nu basically has hierarchical dataframes built-in, along with lots of facilities for their manipulation. There have been a few other attempts at this but the benefits are obvious. Rather than figuring out how to `awk` your way through whatever text output a command generates, command output in Nu is structured and everything can be handled in orthogonal ways.
3. modern conveniences built-in, like syntax highlighting, and AFAIK they want to include features like "do something when you cd into a directory" that we currently need more tools for (i.e. direnv, which I highly recommend!)
4. serious technology. The people behind it are experts and JT has been showing off (https://youtu.be/3o8b_QcrFHc) the engine that enables trivially parallelizable loops. No more need for `xargs`.
5. I hesitate to mention "made in Rust" as a feature, but using a modern language for core infrastructure does matter.
The thing is, there's currently NOTHING GOOD for "shell scripting". Shell sucks (yes it does), so for anything more than very short things I'd rather write Python. But Python sucks for shell-like things, parallelization, it has slow startup, and you also can't do things like put environment variables into your session or change the working directory, so you often wind up writing shims (eg. Broot's br alias - https://dystroy.org/broot/install-br/).
Yes I've looked at Xonsh but maybe the additional syntax is offputting to me. Like, I wouldn't use it as a shell over Zsh (how's Xonsh's fzf support? I don't know, but I know everything's going to support Zsh), and I dunno if I want to use its syntax extensions over just Python. Though It's always on my list of things to re-explore, and maybe it'll click one day. But it being based in Python makes it feel slow (I wrote my prompt in Zig to get it to be fast...)
This is relevant to mention: I wrote a small Python library (https://github.com/kbd/aush) that's basically a DSL for subprocesses, so it tries to make it more convenient to do shell-like things. I find it preferable to shell or Python alone most of the time. Here's an example of its use in my script that creates a new Python project: https://github.com/kbd/setup/blob/master/HOME/bin/create-pyt...
I haven't figured out a convenient way to implement shell piping well with Python's pipe operator, or pass through interactive output directly (so things that "update" the display, like poetry and npm don't behave the same as they do interactively) so it's still .9 status, but it works really well for what it is, and you can always write "regular Python" along with it.
Anyway, Nu seems to be an attempt to put a "real" programming language REPL in my shell, from people who have serious language experience, so I'm hopeful it'll be great.
I appreciate the clarity of your message... curiously enough all the things that you mention I see them as anti-features of nushell (except the first one)
1. Posix shell is clunky has its limitations but there's nothing really flawed about it. It is nice to have non-posix shells, though; in that I agree with you.
2. I hate hate hate the very concept of dataframes. They seem like a useless over-engineering. Plain tabular data is a perfect, and the columns of a table are always named 1, 2, 3. The whole point of abstraction is that you do not care about the meaning of the columns of your table, and the programs (like the lovely awk) that deal with these columns do not care either. There's nothing more "orthogonal" than that: filters that do not understand the data but can filter it anyway.
3. syntax highlighting is a very personal issue; in my case I prefer my terminal not to look like a christmas tree.
4. xargs is one of my favorite tools (alongside gnu make and gnu parallel) and there's nothing "unserious" about it. The happiest moments in my programming life are when I get to use these tools. Not using xargs sounds like a nightmare!
5. Rust is definitely an anti-feature to me: it's like a language that was built by picking the worst features of many already ugly languages. I would not really care in what language the shell is written, but I'd rather have it written in saner, "unsafe" languages.
I think shellcheck is the best argument against this. POSIX shell is just stuffed to the brim with weird gotchas, places where the obvious way to write something causes subtle bugs down the line.
It's the only programming language I use that feels adversarial, where you have to be paranoid to properly solve simple tasks. (Admittedly some of that is because of the reliance on system programs rather than the shell language itself.)
This may be just that you are not very used to the language. I have the same dreadful feeling (that the language fights against me), even when using languages that I'm reasonably proficient with.
For example, in C++, a simple expression like "y = f(x);" already gives me the chills... Is the () operator overloaded? and the assignement operator? If the object x has size equal to 10GB, and y is supposed to have the same size, how much memory does this operation require? 10GB? 20GB? 30GB? 40GB? each of these completely different answers is perfectly reasonable, depending on extremely delicate details of the implementation.
Garbage-collected languages are even worse, I never know whether they will start a memory reclaiming spree that will halt my program for a few seconds.
Even in python, I have this sort of jump scares a few times per month.
The point of fish is that there is no configuration required.
You don't have to learn to configure it, you don't have to be part of "the community" to learn which plugins to use, you'll be able to sit in front of any fish prompt and have it work as expected without having to move dotfiles around.
I use Fish, however I also use Vim and do the plugin hunt there. I enjoy it, but I’m glad to not be doing it for both my environments.
I think it would be more accurate to say that the point of fish is that there is no configuration allowed. If you don't like the out of the box configuration, I would say configuration is still required, but it's unfortunately not available. If you happen to like every single decision the developers made, then I admit having no configuration does mean you end up with a simpler, faster, more maintainable shell.
Then either decide to like it -- humans are adaptable, this is possible -- or don't use the thing. Both outcomes are acceptable. A hammer doesn't need to have a configurable grip and head and claw in order to be a good tool.
A: Linux is amazing, I can configure everything the exact way I want.
B: Linux sucks, I need to mess around with configurations for hours before I get something usable.
A lot of us just want something that works out of the box with amazing defaults. Others want something that can be tuned to their exact preferences. However, configurability comes with it's own costs too.
You can configure scripting to run at various times, and there are even plugin frameworks for Fish. It just doesn't have toggles for things like language features in the way that ZSH does.
In recent years the existence of frameworks like oh-my-zsh has contributed further to this situation because it has separated the detailed configuration from the base zsh project. It's a pity omz doesn't enable more really. Many things it does are not really useful unless you take the time to actually learn them. A lot of plugins just define aliases but if you don't know what they are, they just sit there unused.
Edit: also things like `kill`. `kill [tab]` gives you a fuzzy-find list of all your processes so it's way faster to use than ps | grep.
All that can't be compared with fish out of the box, which is why I am using fish, it will be 10 or so years now. When I say use, I mean that, I just use it, I don't spend time learning it's obscure features, creating scripts etc, no, just use it.
I have alias list that I use to make myself productive and it goes along with me to a new machine. Very slim and simple configuration. That and Vim, but that is another story.
i have a collection of them in my .zshrc that i would love to use.
$ alias foo bar
$ function foo --wraps bar --description 'alias foo=bar'
bar $argv
end
these two are basically equivalent. you'll need to $ funcsave foo
to make it persist. this will write foo.fish into that functions folder.there's also abbreviations like
$ abbr --add ll ls -lh
which expand as you type. ll won't end up in your history because it's expanded before that.The killer feature over aliases is that a) you can edit them and b) you can define them instantaneously.
Did you type `git diff --cached` one time to many? Up arrow -> Ctrl+a -> "abbr gdc " <enter>
Bam. `gdc<space|enter>` now expands to that. It's there forever. And that's how you end up with 100+ abbreviations.
Most people do not have a dotfiles repo.
Of course you can get even more involved and manage your dotfiles with ansible or something but the advantage of a tool like fish is that it's almost perfectly usable out of the box. More config files will always increase the chance for things breaking.
https://gist.github.com/abhigenie92/a907cdf8a474aa6b569ebe89...
The default setup is pretty much perfect for what I want. My only additions are fzf for history search, a bunch of aliases and Starship for informative status lines.
Unknown user on discord
Nushell takes the ideas behind Fish even further by incorporating types other than strings and adding more built-in functionality that’s useful for your average command-line user.
I doubt I’ll go back but both are great! Highly recommend Fish and Nushell!
Just tried it and there's no
- out-of-order tab completion
- preview with left/right arrow completion
- case-insensitive/smart-case completionWhen we built our CLI for Crunchy Bridge it was a couple lines to add tab completion to the CLI when running in Fish (https://blog.crunchydata.com/blog/introducing-the-crunchy-br...), love that when building such tooling giving a better end user experience was so simple.
In the end I realized a well configured toolkit is enough for 99.99% of people, and there are an endless number of those as well. I use zsh-quickstart-kit which is updated often and has good speed and amazing features. You get all the fish features AFAIK and more with no risk of scripts breaking and it was a 1min install.
For non devs who don't need to script I'd recommend fish and there are distros that default to it now.
And this is just one example; fish is full of small usability touches like that.
If you need to run a bash script, `bash the_script.sh` still works
If you have four files starting with "A", one of which ends in .gz, typing "gunzip A" will suggest the .gz file.
Likewise for things like "git add" - as soon as you type an identifiable prefix to a changed file it will be suggested (eg if you only have one changed file in src/ it will suggest that when you type git add src)
Bash does this for me as well.
The difference is that fish does this of the box with no configuration.
[0]: except in the RHS of a variable assignment or after the ‘case’ keyword
One key thing I like from Fish is their command history feature, where you can use the up/down to move backward/forward the history.
I can't find a way to get this to work in ZSH I don't like having to CTRL+R for going backward (how do you even go forward, I can't remember :D)
Fish shell - https://news.ycombinator.com/item?id=27180420 - May 2021 (118 comments)
Fish Shell 3.2 - https://news.ycombinator.com/item?id=26302678 - March 2021 (128 comments)
Fish is not operational on a VT220 terminal (2015) - https://news.ycombinator.com/item?id=25526237 - Dec 2020 (113 comments)
New Features in the Fish Shell - https://news.ycombinator.com/item?id=24631138 - Sept 2020 (138 comments)
Dolphins learn from their peers to use empty shells to catch fish - https://news.ycombinator.com/item?id=23660910 - June 2020 (8 comments) (<-- just kidding)
Fish: A command line shell for the 90s - https://news.ycombinator.com/item?id=21361696 - Oct 2019 (83 comments)
Fish shell 3.0 - https://news.ycombinator.com/item?id=18776765 - Dec 2018 (220 comments)
Fish: A user-friendly command line shell for macOS, Linux, etc - https://news.ycombinator.com/item?id=15910897 - Dec 2017 (204 comments)
Fish (Shell) for a Week - https://news.ycombinator.com/item?id=14422672 - May 2017 (2 comments)
The fish shell is awesome - https://news.ycombinator.com/item?id=14179081 - April 2017 (7 comments)
Fish Shell Design Principles - https://news.ycombinator.com/item?id=11102941 - Feb 2016 (71 comments)
Fish shell 2.2 - https://news.ycombinator.com/item?id=9873090 - July 2015 (70 comments)
Fish shell - https://news.ycombinator.com/item?id=9566441 - May 2015 (182 comments)
FISH Shell: A dynamic shell - https://news.ycombinator.com/item?id=8783150 - Dec 2014 (3 comments)
Fish shell 2.1 - https://news.ycombinator.com/item?id=6626635 - Oct 2013 (151 comments)
fish shell - https://news.ycombinator.com/item?id=6224524 - Aug 2013 (75 comments)
Fish shell 2.0 - https://news.ycombinator.com/item?id=5723235 - May 2013 (175 comments)
Fish 2.0 shell beta - https://news.ycombinator.com/item?id=5567639 - April 2013 (56 comments)
Fish: Finally, a command line shell for the 90s - https://news.ycombinator.com/item?id=4073162 - June 2012 (146 comments)
Fish sucks (but your shell sucks more) - https://news.ycombinator.com/item?id=2031110 - Dec 2010 (60 comments)
Fish - The friendly interactive shell - https://news.ycombinator.com/item?id=820677 - Sept 2009 (16 comments)
Fish Shell: A User-Friendly Shell or Like a Heavily Customized zsh - https://news.ycombinator.com/item?id=811113 - Sept 2009 (8 comments)
As much as I like the fish shell, I really consider this an anti-feature. A TUI application to configure the shell would make much more sense. The terminal emulator is your platform, not the Web.
But you're in luck; looks like the next version will have everything also configurable via text: https://github.com/fish-shell/fish-shell/issues/3625
> I’ve been lurking the fish smell for a couple of years now (and the nushell but it is another story for another time). Not so long ago, I decided to try it, and it’s simply… amazing.
..., had a "wtf"-moment (I thought that "nushell" was some kind of clam - my mothertongue is italian), then I read what followed so I started over paying more attention to what was written. I had to laugh :))
- highlighting and displaying last suggested command execution from history
- file/dir highlighting
- commands coloring and stuff
Then check 'UPDATE 1' from here:
https://vermaden.wordpress.com/2021/09/19/ghost-in-the-shell...
I can not use FISH as it does not honor the POSIX syntax for loops and stuff and I often type 'for' and 'while' POSIX loops at command line so I use ZSH. Besides that FISH is really nice shell.
Regards.
Malware and Phishing
This site is blocked because it is a known security threat. Please contact your network administrator to gain access.
My assumption this is because I have Xfinity Business Class and it's blocking the site. But why would I be seeing this so often on a site linked from HN?
You might want to reach out to Xfinity support, or bypass their filter using a VPN or proxy.
By that I mean any scripts included in these projects. I have seen only a few scripts though.
No, never, ever bit me.
The only common case where we find that splitting on spaces is actually needed is pkg-config and related tools, because that prints flags to be passed to the compiler, and it does it with spaces so it looks nicer and copy-pasteable:
$ pkg-config --libs gio-2.0
-lgio-2.0 -lgobject-2.0 -lglib-2.0
(ideally, it would simply use newlines here, which bash et al would also split on)Typically, the easy workaround is `string split " "`:
> somecommand (pkg-config --libs gio-2.0 | string split " ")
Otherwise, this is quite rare in practice. Most unix tools already operate on a line-by-line basis, which allows them to be easily greppable.(Without having to first learn/spend time about howto setup and configure plugins etc.)
Think about that for a while.
Yes, I could fiddle and twiddle with settings and configure a nicer shell, but Fish on its default settings on any OS just makes things smooth and easy!
But I just use it as a way to run commands, and I use dynamic languages to create scripts just not bash..
Does anyone know how to do something like this with Bash?
for i in *.pdf; echo $i
Shorter than the fish version. Does that mean that it's a better shell then?Note how Plan 9 rc is also not POSIX.
Shell scripts have shebangs and work.
Exactly this - I feel like it is a common misconception.
Even without shebang? `bash the_thing.sh` -> done.
Writing a personal utility for myself? Unless it is dead simple I'll go with fish. It'll work with spaces in file names by default, I won't need `while < read`, etc.
Writing anything I need to distribute? sh or bash
I've been using fish for years and years and never once have I thought "oh man I wish this was POSIX" because POSIX was always 3 key strokes away if I really needed it: `sh<CR>` (which, I did not, unless I had to write a portable script and needed a repl)
Also, it's just shell. By the time I end up with a complicated shell script, i've rewritten it in go, python, etc.
This is just my two cents, if I see more people talking about and using oil shell, I may reconsider.
bashI would strongly not advise to make it the default shell though as this can lead to issues. The way I use it is to have bash as my main shell but my .bashrc starting fish if it's not started explicitly from bash: (it's a trick form arch wiki)
if [[ $(ps --no-header --pid=$PPID --format=cmd) != "fish" ]] then exec fish fi
I've been using fish for a long time with this setup and never encountered an issue.
I've heard this a lot, but I've been using Fish as my login shell for many years, and it's really not a problem
I think maybe some vim plugins call out to your $SHELL or something, but assume that it's bash-like? but I've never run into a serious issue with just using Fish as my login shell
I've been running Fish as my login shell for almost 10 years now, on Linux and then additionally for ~4 years for intermittent macOS usage (only at work) without issue.
I don't really like launching Fish from ~/.bash_profile because or similar because I don't like having to type `exit` twice to exit, and `exec`ing into Fish leaves you in one shell but with your $SHELL variable set to another.
But if that works for you, more power to ya, and it's good for Fish users to know that that's an option if they run into issues using Fish as a login shell.
From the `exec` manual:
If exec is specified with command, it shall replace the shell
with command without creating a new process. If arguments are
specified, they shall be arguments to command. Redirection
affects the current shell execution environment.
https://man7.org/linux/man-pages/man1/exec.1p.htmlWhat? No it doesn't. Shebang exists for a reason, and you should ALWAYS use it anyway, fish or not.
I want to like it. It's goals and purposes seem to be in the right place, but....
Nope.
There's a new generation of shells on the rise which look up to both Fish and PowerShell as models of different virtues they want to embody. A lot of them are already usable, and some day a few of them will be killer apps for developers and sysadmins
https://docs.microsoft.com/en-us/powershell/module/microsoft...
Using other shells is like living in the stone age. I don't know why people would do that to themselves.
1. You have to go out of your way to fetch the full help pages on a given PowerShell installation (they're not stored locally by default).
2. Even after you fetch the full help, not all of it is actually included in the Get-Help output (IIRC examples), so you often need to use `Get-Help -Online`, which opens a separate application (browser) and that sucks
3. Inside the terminal, there's little to no special formatting or syntax highlighting, unlike what you get with a good `man` pager
4. Get-Help output (unlike `man` output as configured on most distros) is not paged by default.
`man` could be better, and I don't really vibe with `info`, but Get-Help isn't that great imo. The actual content of the help is quite good, and it's nice that it includes examples, but the same is true of most man pages.
And it does this every time you spawn a shell. So if you have set your login shell to fish, then every time you launch a shell it loads all the fish plugins like this one, and that slows it down. And you can’t turn it off, or couldn’t the last time I checked around a year ago. Insult to injury? The PR where this was requested was closed by the devs as “wontfix”.
This, and it’s lack of POSIX compatibility, made me switch back to zsh.
It does not. The completion generation is on first start and whenever you run `fish_update_completions`.
(note that the importance of man parsing is often quite overstated, it only gets you so far, all the advanced completion stuff is hand-written)
Source: I'm a fish dev.
Fish completions and functions are lazy-loaded, so this doesn't happen unless you write your config to force it to happen.
Fish also provides you with functions you can use to check whether a shell instance is a login shell, is interactive, or is just being invoked as (part of a) script. If you do have some heavy-duty stuff you want to run on startup for your login shell or your interactive shells, you can do that selectively and keep Fish startup for other purposes fast.
Extend, embrace, extinguish?...
So thanks, but not thanks. Not to me.
Wouldn't be much more practical to use all of those talent and ideas to help to improve the extant bash shell instead?
See plan9, RedoxOS, TempleOS, Gemini, etc.
None of these are currently in a position to gain dominance, but they all explore a space that couldn't be explored starting with a prior code base.
The EEE analogy is more applicable to GNU Bash anyways: it extended the POSIX sh baseline with a bunch of GNUisms that a lot of "POSIX" sh scripts now unintentionally use.
In any case I am not aware of any GNUism that is actually useful in scripts, so taking care to not use any syntax variant specific to bash is not a problem.
All the important bash features that are not POSIX are not GNUisms, but they are:
1. The 50% of the new ksh 1988 features that have not been included in the POSIX shell, e.g. condition testing "[[ ... ]]" and arithmetic testing "(( ... ))".
2. All the new features added by ksh 1993, none of which have been included in POSIX, e.g. "for (( ... ))" and the extra parameter expansions that replace the most common invocations of sed or awk.
3. The brace expansion from csh
4. The extended brace expansion forms added by zsh (which generate arithmetic progressions and are usually preferable to "for ((...))")
Attempting to write POSIX-compliant scripts in 2021, i.e. not using these extra ksh/csh/zsh features provided by bash, is a huge mistake in my opinion, because without these features any non-trivial script becomes much longer and much more error-prone.
The Google recommended style for shell scripts (https://google.github.io/styleguide/shellguide.html), which is based on using all bash features, is pretty decent. It is far less work to ensure that bash or ksh/zsh exists on any target system than to maintain any obsolete POSIX-compliant scripts (which are stuck to the 1979 Bourne shell features + only half of what ksh 1988 has added).
And that’s just one small example.
[1]: https://www.gnu.org/software/bash/manual/html_node/Shell-Par...
1. expansions introduced by the Bourne shell in 1979
2. expansions added by the Korn shell in 1988 (e.g. ${parameter#word} and ${parameter%word})
3. expansions added by the Korn shell in 1993 (e.g. ${parameter:offset:length} and ${parameter/pattern/string})
There are no parameter expansions that have been introduced by bash.
I agree that the parameter expansions introduced by ksh93 are extremely useful in scripts.
The fact that they are not compliant with POSIX is a good reason to ignore POSIX compliance.
The POSIX compliant way is to use sed for substitutions and awk for substrings (even expr is not POSIX compliant), which results in much longer expressions in which it is easy to make mistakes, and in slower scripts, because external processes must be executed even for simple string expressions.
I assume that you refer to the "${PARAMETER@OPERATOR}" type of parameter expansion, which is mostly used to either replace invocations of tr for character conversions or to provide quoted strings.
You are right that this kind of parameter expansion is specific to bash and I was wrong when I have said that there are no bash specific parameter expansions. "${PARAMETER@OPERATOR}" is the only exception that was introduced by bash and which has not been taken from the Bourne or Korn shells.
I have forgotten about it, because I do not use it, precisely because it is the parameter expansion variant that is provided only by bash.
Yeah, good luck with that.
It's a garbage pile of code that creates an interpreter with piles upon piles of undefined behavior that random scripts out there in the world rely on.
I don't even think it was a working CI setup.
I'd be super glad to be proven wrong, maybe things have changed in the meantime.