El comando which en Linux: localizar comandos ejecutables

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 en PATH, 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), which no lo encontrará.
  • En algunos shells, which puede ser un alias o una función que enmascare el comportamiento real, lo que lleva a resultados confusos. Se puede verificar con type -a which para 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, which lo 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 a command -v, pero con más detalle sobre el tipo de comando (alias, función, built‑in, archivo).
  • whereis: busca no solo en PATH, sino también en directorios de fuentes y páginas de manual.
  • find con expresiones como find /usr -name "python3" -type f -executable: útil cuando se necesita buscar en ubicaciones específicas fuera de PATH.

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.