I wanted to install the latest version of zsh on my MacBook Pro. This is
usually the first thing I install when setting up a new machine. A
install zsh and a
chsh later and I'm good to go (well, technically I had to
add the homebrew location of zsh to
/etc/shells as well). Close out
Terminal.app and reopen to make sure my changes took effect, and sure enough,
there's my zsh prompt.
Yes, I know macOS Catalina ships with zsh as the default shell, but I want to make sure I have the latest... just because.
Curiosity strikes in and I wonder, even though the homebrew location of zsh is configured as my shell, am I actually using it?
~ % which zsh /usr/local/bin/zsh
Hold on. I want the full location.
~ % ls -la $(which zsh) lrwxr-xr-x 1 wally admin 27 Dec 28 20:28 /usr/local/bin/zsh -> ../Cellar/zsh/5.7.1/bin/zsh
Yup, that looks about right.
But wait... that only told me the location of zsh the executable which is only
correct because I added homebrew's
/usr/local/bin location to my
PATH. That is literally
the first line of the man page for
WHICH(1) BSD General Commands Manual WHICH(1) NAME which -- locate a program file in the user's path
That means that if I were to execute
zsh from my current shell a new instance
of zsh from
/usr/local/bin/zsh would begin. This doesn't tell me the location
of the shell I'm currently typing in which started after opening Terminal.app.
~ % echo $SHELL /usr/local/bin/zsh
Eh, I don't know. That tells me that it's configured as my shell but does not necessarily tell me the location of the shell I'm currently typing in.
Maybe I can find the currently running process of the instance of zsh I'm in right now.
~ % ps PID TTY TIME CMD 78525 ttys003 0:00.11 -zsh
Well that still doesn't give me the full path. And is that even the right
process? How do I get the PID of the shell I'm currently typing in? Turns out
there's a convenient shell variable
~ % echo $$ 78525
Hmm, that's good I suppose, but I still don't know if the process with PID
78525, the one I'm currently typing in, is the correct zsh.
Oh yeah, I probably should have used
lsof a long time ago but knowing how to
get the PID of the current shell makes things a bit easier.
~ % lsof -p $$ COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME zsh 78525 wally cwd DIR 1,5 1120 362897 /Users/wally zsh 78525 wally txt REG 1,5 614404 1052389 /usr/local/Cellar/zsh/5.7.1/bin/zsh ... trimmed output ...
Ahhh, finally! Not a single of instance of
/bin/zsh in the output. I think
I'm pretty happy with this result.
Are There Other Ways?
But now I'm even more curious. Are there other ways to find this same
information? Turns out
apropos process returned a few results but of the
bunch the only interesting find was
~ % fuser /usr/local/Cellar/zsh/5.7.1/bin/zsh /usr/local/Cellar/zsh/5.7.1/bin/zsh: 78525
Neat. That PID matches
~ % fuser /bin/zsh /bin/zsh:
And no results for the pre-installed macOS version of
macOS Activity Monitor
If you want a more point-and-click way of finding the same information then Activity Monitor has you covered. Make sure View > Applications in last 12 hours is selected. Expand Terminal.app and double click zsh. Clicking the Sample button on the bottom left gives you some detailed information about that running process.
Fun fact: you can use the
sample command for the same information.
Finding the shell you're actually using isn't all that simple at first. You
can find the location of the executable of the shell. You can find all
the processes currently running with that shell name. But gathering information
about the shell you're typing all those commands in to find the shell you're
using requires a little more poking around. The two easiest solutions, on macOS
at least, are
fuser. Activity Monitor also offers up a GUI for
finding the same information but you need to know how to dig into it.