How to run a command after changing directories in zsh

Josh Sherman
2 min read
Command-line Interface

About once a year or so, I go through my dotfiles and do some clean up. Usually around spring time, but also, usually after I discover some new hotness that I had not known about that I want to leverage.

This year, it’s both. Spring is nearly in the air, and I’ve been wanting to port my stuff to use GNU stow as well as take advantage of zsh hooks.

My interest in zsh hooks is because of a little trick that I implemented years ago, to automatically display the contents of a directory with ls after changing into the directory, using cd.

The route I took initially, which does work in both bash and zsh and probably other shells, is to create a function that replaces cd that runs both cd and ls as such:

# `ls` after `cd`
function cd {
	builtin cd "[email protected]" && ls
}

My recent discovery of zsh hooks got me excited enough to rethink my previous solution. The hooks work more like a side effect instead of munging with the original command.

The same solution using the zsh hook that gets executed after the you change a directory looks like this:

autoload -U add-zsh-hook

ls_after_cd() {
	ls
}

add-zsh-hook chpwd ls_after_cd

Definitely a bit wordier, but I’d argue that this is “the Z shell way” to go about this. Obviously, this wouldn’t work in other shells and is zsh specific.

In all honesty, I wasn’t very happy with the syntax and also came to realize that neither my original solution nor the zsh hook solution allowed me the option to run cd without running ls.

This got me to ask myself “self, why did you opt to write a function instead of creating a new alias?”

Well I went ahead and tried that, and turns out, it didn’t quite work the way I expected it to.

Interestingly enough, it would seemingly change to the directory, would list the contents of the destination directory, but then I would still be in the same directory that I had started with.

Figuring out how to create an alias for this would have been nice, but I didn’t want to spend all day trying to figure it out, as I still had more spring cleaning to do for my dotfiles!

Join the Conversation

Good stuff? Want more?

Weekly emails about technology, development, and sometimes sauerkraut.

100% Fresh, Grade A Content, Never Spam.

Related Articles