As I continue my move from Bash to Zsh at Apple’s strong suggestion I continue to bump into little differences that cause me minor problems. Today it was the fact that while Bash treats comments as comments even when they’re entered in an interactive shell, Zsh does not, at least not by default on MacOS.


Read more

Tagged with:

At Apple’s advice I’ve switched the login shell from Bash to Zsh on all my Macs. For the most part, what worked in Bash works in Zsh, but sometimes I do still want to get back to Bash to test something or to check something. You might imagine that simply typing bash from a Zsh prompt would get you a Bash shell, and you’d be right, sort of. When you just run the command bash you get a bare shell without the customisations that would have been applied when you opened a new Terminal window with Bash as your default shell. This will be immediately obvious because the prompt will be the basic bash-3.2$ as opposed to the hostname, current folder, and you’re username like you were used to.

The solution is really simple — pass the -l flag to signify that you want your new shell treated like a login shell, and hey presto, you’re back to Bash just like you remembered it 🙂

So, if you switch your Mac to Zsh, you get back to the Bash experience you had before with the following command:

bash -l

Tagged with:

At Apple’s recommendation I’ve moved from Bash to Zsh on all my Macs. This has been a mostly smooth transition, but I have run into a handful of little gotchas. This week it was an error when trying to execute a command I’d been using in Bash for years. The error started zsh: no matches found.

The cause of this error is a subtle but important difference in how Bash and Zsh handle file globbing (expansion of the * character) when no files match the specified pattern. By default, Bash happily expands expressions that don’t match anything into an empty list. Zsh’s default behaviour is to raise an error and prevent the command executing.

TL;DRsetopt NULL_GLOB to enable Bash-like behaviour, and unsetopt NULL_GLOB to revert back to the Zsh-like behaviour.

Read more

Tagged with:

Apple recently announced that it’s moving the MacOS from the Bourne-again Shell (Bash) to the Z Shell (Zsh), and advised developers to make the change now, so they’re ready when they remove Bash altogether in some later version of the OS. Since I’m a big believer in not swimming up-stream, I decided to take their advice and switched to the Z Shell immediately.

The first thing I noticed was that the default prompt Apple provides for Zsh on their OS gives a lot less information than their default for Bash did. This is a sample of their old Bash prompt:

bart-imac2018:Documents bart$

That tells me the machine I’m on (bart-imac2018), the folder I’m in (Documents), and the username the shell is running as (bart), and whether or not I have super-user privileges ($ means no, # means yes). These are all very useful things, particularly when you SSH around a lot and su/sudo to different accounts. Also, IMO showing only the top-level folder rather than the full path gives a nice balance between the prompt getting too big, and not knowing where you are. I’ve never felt an urge to change the Mac’s default Bash prompt.

I can’t say the same about the Mac’s default Z Shell prompt! This is what I get on the same machine with the Z shell:


It only shows the machine name (bart-imac2018) and whether or not I have super-user privileges (% for no, # for yes)!

Thankfully getting back to the old Bash-like prompt is easy — the TL;DR version is that you simply need to add the following line to your ~/.zshrc file:

PROMPT='%m:%1~ %n%# '

If you’d like to understand how exactly that works, and what other choices you have, read on!

Read more

Tagged with: