The most common tripping points are the minor adjustments in syntax, probably the biggest one being command substitution:
Bash:
$ echo “$(ls -al)”
Fish: $ echo (ls -al)
You get used to it though.Another thing many bash-ers sometimes miss is the !! substitution, e.g.
$ apt update
# permission denied
$ sudo !!
This doesn’t work in fish, BUT fish does offer a handy keybinding out of the box to prepend ‘sudo’ to your current command line (submitted by yours truly). So when using fish, you’d handle the above scenario like this: $ apt update
# permission denied
# press Up or Ctrl-P followed by Alt-s
$ sudo apt update
There are so many other great things I love about fish, but this comment is already long enough.Be sure to read (or at least scan) through the user guide on their website. It’s an easy read and not dense. You can also view it at any time by running `help` from inside fish.
I can’t recommend fish highly enough, I’m excited for your journey :)
So I spent a day migrating my fish config to zsh, and am much happier now.
Regarding a bare shell: perhaps I’m not understanding your exact needs, but fish is able to check whether or not it’s being used interactively with `status is-interactive`, so you could certainly try wrapping all of the plug-in loading machinery around a guard like this.
[1]: https://git.sr.ht/~gpanders/dotfiles/tree/master/item/.confi...
function bind_bang
switch (commandline -t)[-1]
case "!"
commandline -t $history[1]; commandline -f repaint
case "*"
commandline -i !
end
end
function bind_dollar
switch (commandline -t)[-1]
case "!"
commandline -t ""
commandline -f history-token-search-backward
case "*"
commandline -i '$'
end
end
function fish_user_key_bindings
bind ! bind_bang
bind '$' bind_dollar
end for f in (ls -1 *py); echo $f; end
One more thing to note is setting ENV var FOO to value bar is set -x FOO bar
Note no equal sign. To delete an ENV var use `set -e FOO`.If you want to set ENV vars permanently for your login shell, the file to edit is `~/.config/fish/config.fish` and the syntax is:
set -gx PATH $PATH /some/new/path
which means set var PATH to whatever PATH contained before with /some/new/path appended to it. $ exec bash -c ‘source script.sh; exec fish’
This has some caveats and won’t work in all cases (both bass and replay.fish go into more detail), but this is what I use and it hasn’t failed me yet.