Glad to!
How To Use Shebang At Top of Shell Script to Set Language
Normally, any line in a shell script that begins with a # is assumed to be a comment. The only exception to that is if it is the first line, and is #! followed by the program you want to use as an interpreter to the shell script.
Normally you will see something like this:
#!/bin/sh
#!/bin/bash
#!/usr/bin/perl
The reason to do this is that someone might be using a different shell but you want to make sure they use the right one, otherwise the script will fail.
BUT what if you installed a newer version of perl at /usr/local/bin/perl and want to use that one instead of the one at /usr/bin/perl?
Well, you could change all of your scripts to use #!/usr/local/bin/perl but then if you are on a Mac which does not have /usr/local/bin/perl installed, it will fail.
That is where env comes in.
By using #!/usr/bin/env FOO you are telling the script, “Use whichever version of FOO that you find first in the PATH."
So if your if PATH looks like this
PATH=/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin
then env will look at /usr/local/bin first, and then /usr/bin and so on. As soon as FOO is found in one of those folders, it will be used.
So, while I expect most of my zsh scripts will be used by people who only have /bin/zsh, because I use env I can use /usr/local/bin/zsh too.
(The only thing you have to be careful about is that if you use any features that have been added to /usr/local/bin/zsh but are not in /bin/zsh then you should specify /usr/local/bin/zsh.)
Portability Is Hard…
In an ironic twist, when I used to have a shell account on a Linux box, changing my zsh scripts to start with #!/usr/bin/env zsh failed because that version of Linux had env at /bin/env instead. Yet another reason I'm happy to have server be with Mac Stadium now.
“How do I tell which shell I’m using?”
If you have a shell script that works but you are not sure which shell is running it, add the line:
echo "$SHELL"
to the script and it will tell you, e.g. /bin/bash/ or /bin/zsh or whatever.