So I have this command in my $PATH,
apachectl. Because I’m on a mac and I’ve installed apache2 through MacPorts, the command that gets found first is my macports install in
/opt. Up until now I’ve always known that
which apachectl will find that location, but to find any other locations of
apachectl I’d usually use
Here’s my original workflow, lets find the location of the
apachectl being called when I don’t specify a path.
Julius:~ caius$ which apachectl /opt/local/apache2/bin/apachectl
Simple enough. Now lets figure out what other locations there’s an
apachectl installed at.
Julius:~ caius$ locate apachectl | egrep "\/apachectl$" /opt/local/apache2/bin/apachectl /opt/local/var/macports/software/apache2/2.2.11_0+darwin_9/opt/local/apache2/bin/apachectl /usr/sbin/apachectl
Right, so now I know where else a command exists in the filesystem called
apachectl, but I don’t know if any of those is in my $PATH, or what order they come in when searching through my $PATH. In this (old) workflow I’d have compared them to my $PATH manually as there’s so few of them.
So I noticed Ali googling for the
which man page on IRC, and (quite stupidly) poked fun at him for doing so. I then swallowed my ego and actually followed the link to the man page, and boy was I glad I did. Just shows with even a fairly simple command like
which, you sure don’t know everything!
What I discovered was that
which has a single flag you can pass it,
-a. From the man page:
-a print all matching pathnames of each argument
Right. So that
locate | grep command plus manually figuring out what is in my $PATH is really hard work then.
which -a should give us the same results, but a lot faster and with a lot less manual thought.
Julius:~ caius$ which -a apachectl /opt/local/apache2/bin/apachectl /usr/sbin/apachectl
And hey presto, yet another useful bit of bash knowledge for me, thanks to Ali not being afraid to RTFM!