Introducción
En el día a día de un administrador de sistemas o un desarrollador que trabaja en la línea de comandos de Linux, es frecuente necesitar saber exactamente qué binario se está ejecutando cuando se invoca un comando. El shell busca el ejecutable en las rutas definidas por la variable PATH, pero a veces existen múltiples versiones del mismo programa (por ejemplo, una instalación del sistema y otra en /usr/local/bin) o se quiere confirmar que se está utilizando la ruta esperada. El comando which responde a esa necesidad de forma rápida y directa, mostrando la ruta absoluta del primer ejecutable que coincide con el nombre proporcionado.
¿Qué es el comando which?
which es una utilidad presente en casi todas las distribuciones de Linux y forma parte del conjunto de herramientas básicas de GNU Coreutils, aunque en algunos sistemas puede estar implementada como un script de shell o como un built‑in de ciertos shells (como zsh). Su función principal es buscar en la variable de entorno PATH el primer archivo ejecutable cuyo nombre coincida con el argumento que se le pasa y devolver su ruta completa. Si no encuentra ningún coincidencia, no produce salida y devuelve un código de estado distinto de cero, lo que permite usarlo en condicionales de scripts.
Sintaxis básica
La forma más simple de usar which es:
which [opciones] comando [comando2 ...]
Algunas opciones útiles son:
-a: muestra todas las coincidencias encontradas enPATH, no solo la primera.-s: modo silencioso; no escribe nada en la salida estándar, solo devuelve el código de estado (útil en pruebas).--version: muestra la versión de la utilidad.--help: muestra la ayuda breve.
Si se omite la opción, which behave como si se hubiera especificado la búsqueda predeterminada (primer match).
Ejemplos prácticos
Imaginemos que queremos saber dónde está ubicado el binario de python3:
which python3
Salida típica:
/usr/bin/python3
Si existen varias instalaciones, por ejemplo una en /usr/local/bin/python3 y otra en /usr/bin/python3, usando la opción -a veremos ambas:
which -a python3
Salida:
/usr/local/bin/python3 /usr/bin/python3
Otro caso frecuente es comprobar si un comando está disponible antes de ejecutarlo en un script:
if ! which rsync >/dev/null; then
echo "Error: rsync no está instalado"
exit 1
fi
Aquí se redirige la salida a /dev/null porque solo nos interesa el código de estado.
También es útil al trabajar con entornos de desarrollo que modifican PATH, como pyenv o nvm. Por ejemplo, tras activar una versión específica de Node.js con nvm:
nvm use 18 which node
La salida mostrará la ruta bajo el directorio de nvm, confirmando que se está usando la versión correcta.
Limitaciones y alternativas
Aunque which es muy práctico, tiene algunas limitaciones que es importante conocer:
- Depende exclusivamente de la variable
PATH. Si un ejecutable se encuentra fuera de esas rutas (por ejemplo, llamado con una ruta relativa o absoluta),whichno lo encontrará. - En algunos shells,
whichpuede ser un alias o una función que enmascare el comportamiento real, lo que lleva a resultados confusos. Se puede verificar contype -a whichpara ver si es un built‑in o un ejecutable externo. - No muestra información sobre permisos de ejecución; si el archivo encontrado no tiene el bit de ejecución,
whichlo mostrará igualmente, aunque el shell fallaría al intentar ejecutarlo.
Para superar estas limitaciones, existen alternativas más flexibles:
command -v: built‑in de POSIX que muestra la ruta o indica si es una función, alias o built‑in, sin depender de un ejecutable externo.type: similar acommand -v, pero con más detalle sobre el tipo de comando (alias, función, built‑in, archivo).whereis: busca no solo enPATH, sino también en directorios de fuentes y páginas de manual.findcon expresiones comofind /usr -name "python3" -type f -executable: útil cuando se necesita buscar en ubicaciones específicas fuera dePATH.
En la práctica, combinar which con type o command -v brinda una visión más completa de lo que el shell realmente va a ejecutar.
Conclusión
El comando which es una herramienta sencilla pero esencial para cualquier usuario de la línea de comandos de Linux. Permite localizar rápidamente el ejecutable que el shell va a utilizar, verificar la presencia de programas en PATH y tomar decisiones informadas en scripts y sesiones interactivas. Conociendo su sintaxis, sus opciones y sus limitaciones, así como las alternativas disponibles, se puede administrar el entorno de trabajo con mayor precisión y evitar sorpresas causadas por versiones inesperadas de los mismos comandos. Incorporar which en la rutina diaria de administración o desarrollo contribuye a una mayor claridad y control sobre el sistema.


