the `which` you’re used to, written in Go.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.


which is a Go implementation of the UNIX command of the same name.


The executable works exactly like the which command:

which [-as] program ...

In addition, it supports a -l command which makes which resolve symbolic links before printing the paths.

However, note that this implementation doesn’t support combined flags (e.g. -al won’t work, you’ll have to use -a -l).

You’ll have to ensure that $GOPATH/bin is at the beginning of your PATH environnment variable if you want to use this implementation instead of the original one.


go get


$ which vim

$ which -l vim

$ which -a vim


which is also usable as a Go library:

// import ""

// get the first executable in $PATH
executable := which.One("vim")

// get all executables in $PATH
executables := which.All("vim")


I know it doesn’t really make sense to re-write a simple tool like which, but I needed the -l option so I wrote this. I use Homebrew on OS X and it installs binaries in a directory then symlinks them into /usr/local/bin/, which means it’s not possible to get the original path by using the original which command alone.