When working in the macOS terminal, you often need to find the full path of an executable binary. This is particularly useful when:
- Debugging PATH issues
- Creating shell scripts
- Verifying which version of a tool is being executed
- Setting up build systems
The most straightforward method is using the which
command:
$ which identify
/usr/local/bin/identify
This shows the first matching executable found in your PATH. However, which
has limitations - it only searches PATH directories and doesn't show all possible matches.
For more comprehensive searching, try these commands:
1. whereis
Finds binaries, sources, and man pages:
$ whereis identify
/usr/bin/identify
2. type (Built-in)
Shows how the shell interprets the command:
$ type -a identify
identify is /usr/local/bin/identify
identify is /usr/bin/identify
3. find (Brute-force search)
For system-wide searches when you're not sure where it might be installed:
$ sudo find / -name "identify" -type f -perm +111 2>/dev/null
/usr/local/bin/identify
/opt/homebrew/bin/identify
For developers needing more control:
Checking File Attributes
Once you find the path, verify the file properties:
$ file $(which identify)
/usr/local/bin/identify: Mach-O 64-bit executable x86_64
Checking Dependencies
View linked libraries with otool
:
$ otool -L $(which identify)
/usr/local/bin/identify:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1292.60.1)
Package Managers
If installed via Homebrew or MacPorts:
$ brew --prefix imagemagick
/usr/local/opt/imagemagick
Here's how I used this in a recent project to ensure the correct Python version was being used:
#!/bin/bash
PYTHON_PATH=$(which python3)
if [[ $PYTHON_PATH != "/opt/homebrew/bin/python3" ]]; then
echo "Warning: Using system Python instead of Homebrew Python"
export PATH="/opt/homebrew/bin:$PATH"
fi
When working in macOS terminal, developers often need to determine the exact path of an executable. This is crucial for scripting, debugging, or when multiple versions of a tool are installed. Unlike pwd
which shows the current directory, we need specialized commands to locate executables.
macOS provides several built-in commands for this purpose:
# Basic location check
which identify
/usr/local/bin/identify
# More comprehensive search
whereis identify
/usr/local/bin/identify
# Shell built-in information
type -a identify
identify is /usr/local/bin/identify
which is the most straightforward command, searching through the directories listed in your $PATH environment variable. It returns the first match found.
whereis searches a broader set of standard locations including binary, source, and manual page files.
type is a shell builtin that can show all instances of a command (including aliases and functions) when used with -a
flag.
For complex cases where a tool might have multiple installations:
# Find all Python installations
type -a python
python is /usr/local/bin/python
python is /usr/bin/python
# Verify which Java will be executed
which java
/usr/bin/java
For advanced users who need to inspect the executable itself:
# Show detailed information about the binary
file $(which identify)
/usr/local/bin/identify: Mach-O 64-bit executable x86_64
# Check symlink chains
ls -l $(which identify)
lrwxr-xr-x 1 user admin 45 May 15 10:30 /usr/local/bin/identify -> ../Cellar/imagemagick/7.1.1-15/bin/identify
When dealing with commands that might be shell aliases or functions:
# Bypass aliases with backslash
\which ls
# For shell functions, use type
type ll
ll is aliased to `ls -l'