- 24 Dec, 2025 *
tldr: I switched from
fishto plain oldbashbecause it’s fast and does what I need it to do
2 years ago, me and my roommate decided to learn vim. We built our very own neovim configs, learned about LSPs, and built a compiler in OCaml. It felt amazing and was also one of my favorite memories from Caltech.
This led me down a certain road. I spent a lot of time trying the latest cutting edge tools: eza, fzf, zoxide, bash -> zsh -> fish, tmux, emacs, (+many more). Some things stuck. Others didn’t.
In this post, I’ll talk about my shell.
Like most users, I started out with zsh (the default shell on my Mac and also my Pop OS Linux box). I had an oh-my-zsh bloaty setup complete with all the bells and whistles:
- completions
- inlay hints & suggestions…
- 24 Dec, 2025 *
tldr: I switched from
fishto plain oldbashbecause it’s fast and does what I need it to do
2 years ago, me and my roommate decided to learn vim. We built our very own neovim configs, learned about LSPs, and built a compiler in OCaml. It felt amazing and was also one of my favorite memories from Caltech.
This led me down a certain road. I spent a lot of time trying the latest cutting edge tools: eza, fzf, zoxide, bash -> zsh -> fish, tmux, emacs, (+many more). Some things stuck. Others didn’t.
In this post, I’ll talk about my shell.
Like most users, I started out with zsh (the default shell on my Mac and also my Pop OS Linux box). I had an oh-my-zsh bloaty setup complete with all the bells and whistles:
- completions
- inlay hints & suggestions
- highlighting and fancy command coloring
- whatever else comes packaged in these zsh setups
I hated how much config bloat came with the shell, so I tried fish. Fish is great. It worked out of the box. I didn’t have to really install any plugins and the shell had even nicer tab completions.
Now, we come to the real reason I switched back to bash. Coming from i3 on my Pop OS box, it feels sluggish to use my mac without a window manager. So, I use Yabai with skhd (for keybinds) on my Mac which allows me to quickly swap between workspaces.
alt-1 for example will go to workspace "1" or my browser main workspace. alt-s will go to my "Slack" workspace and alt-m will go to the "Music" workspace which usually has spotify open. This workflow is a non-negotiable for me. I’ve built up the muscle memory so my code will always be on alt-2 or alt-3. My apps are just one keypress away. I can never go back to the old "dragging my windows aroung" or "swiping between desktops" workflow.
Now, what’s wrong with fish? It’s slower than bash. In my case, noticeably slower. skhd routes all commands through your shell, so when I have a couple windows open on multiple (5+) workspaces, switching between workspaces becomes painfully slow. I hit alt-1 and wait a second before it eventually switches over to workspace 1. I looked into it and tracked down the problem to this exact GitHub issue: asmvik/skhd#42 where user @rubensf explains he had the same issue as me.
Shells like fish and a bloated oh-my-zsh installation have startup overhead (loading all sorts of plugins and extra functionality). The solution to my problem was to just launch skhd with SHELL=/bin/bash skhd, forcing it to use bash to execute commands instead of the slower fish. This instantly fixed my delay issue.
I don’t need clever highlighting in my max 30 character commands. I don’t need auto-suggestions; I have ctrl-R. I don’t need any plugins.
All I need is a fast shell that lets me run commands. I’d like it to look decent and give me basic git branch/status info, both of which I can do with starship and 1 line of config. I don’t need a package manager for my shell. It’s just a shell.
I’m sure I could have different profiles for interactive and non-interactive shell instances, and maybe this could help me squeeze out more performance from these other shells. But why go through all that pain for syntax highlighting and autosuggestions? I don’t want or need them. zsh might be faster in some array/loop procedures, but this doesn’t affect me or my use-cases.
So now, I just use bash.