Comandos LinuxExplicados en español
/
Ficha94 / 104
Categoría
Sistema
Ejemplos
4
Ver también
ls · find · sudo · history

which

which (cuál)

Muestra qué archivo se ejecutaría si escribes ese comando.

Busca en el PATH, que es la lista de carpetas donde la terminal busca los comandos, y devuelve la ruta exacta del programa que se ejecutaría. Lo usas para saber de dónde viene una herramienta, confirmar que sí está instalada y detectar cuando tienes dos versiones del mismo programa. Es un programa normal, no un comando de la terminal: bash trae dos equivalentes más amplios, type -a y command -v, que además reconocen alias y comandos internos.

Sintaxiswhich [-as] COMANDO...
§ 1

Despiece

4 ejemplos
Ver de dónde viene un programa

Ver de dónde viene un programa

2 piezas
Lámina01 / 04
Comandowhich python3
Piezas2
Escala1:1
N.ºPiezaTipoQué hace
1whichComandoEl comando que busca el programa en el PATH.
2python3ArgumentoEl comando del que quieres saber la ruta.
Resultado

Imprime /usr/bin/python3, que es el archivo exacto que se ejecuta cuando escribes python3. Es la forma rápida de confirmar que una herramienta está instalada y de dónde salió, sin abrir el gestor de paquetes.

Ver todas las copias que hay

3 piezas
Lámina02 / 04
Comandowhich -a python3
Piezas3
Escala1:1
N.ºPiezaTipoQué hace
1whichComandoEl comando que busca el programa en el PATH.
2-aOpciónMuestra todas las coincidencias del PATH, no solo la primera.
3python3ArgumentoEl comando del que quieres saber todas sus rutas.
Resultado

Sale /usr/bin/python3 y /bin/python3. Casi siempre son el mismo archivo dos veces, porque en Debian y Ubuntu /bin es un enlace simbólico a /usr/bin. Lo que importa es la primera línea: esa es la que gana. Si tu PATH tiene /usr/local/bin antes que /usr/bin, y ahí hay otra copia, esa es la que se está ejecutando aunque parezcan la misma versión.

Comprobar si un comando está instalado

3 piezas
Lámina03 / 04
Comandowhich -s htop
Piezas3
Escala1:1
N.ºPiezaTipoQué hace
1whichComandoEl comando que busca el programa en el PATH.
2-sOpciónNo imprime nada: solo devuelve el código de salida.
3htopArgumentoEl comando que quieres comprobar.
Resultado

No sale ninguna línea, exista o no exista htop. Lo que hace es dejar el resultado en el código de salida: revísalo con echo $?, donde 0 significa que el comando existe y 1 que no. Por eso el -s es el que se usa en scripts.

Avisar si falta un comando

6 piezas
Lámina04 / 04
Comandowhich -s cowsay || echo "cowsay no está instalado"
Piezas6
Escala1:1
N.ºPiezaTipoQué hace
1whichComandoEl comando que busca el programa en el PATH.
2-sOpciónNo imprime nada: solo devuelve el código de salida.
3cowsayArgumentoEl comando que quieres comprobar.
4||OperadorEjecuta lo que sigue solo si el comando anterior falló.
5echoComandoImprime un texto en la pantalla.
6"cowsay no está instalado"ArgumentoEl mensaje que se imprime si el comando no existe.
Resultado

Si cowsay no está instalado, which devuelve 1 y el || hace que se imprima cowsay no está instalado. Si sí está, no se imprime nada. Es el patrón clásico en scripts; con -s la ruta no se cuela en la salida del programa. Sin la s también funcionaría, porque el código de salida es el mismo, pero se vería la ruta encontrada.

§ 2

Opciones

Las que sí vas a usar
OpciónQué hace
-aMuestra todas las coincidencias del PATH, no solo la primera. La primera línea es la que la terminal ejecutaría de verdad; las de abajo suelen ser versiones viejas que quedaron instaladas.
-sNo imprime nada: solo devuelve el código de salida, 0 si el comando existe y 1 si no. Es la opción que se usa en scripts, porque no ensucia la salida.
§ 3

Fallas comunes

FallaRemedio
which cd y no sale nada, aunque cd sí funciona.cd no es un programa: es un comando interno de bash, igual que source, alias o export. which solo busca archivos ejecutables dentro del PATH, así que jamás va a encontrarlos. Para esos usa type -a cd o command -v cd, que ya vienen en la terminal.
which -s no imprime nada y parece que falló.Eso es justo lo que hace la s: no imprime nada y solo deja el resultado en el código de salida. Compruébalo con echo $?, donde 0 significa que existe y 1 que no. Sin la s, which tampoco imprime nada cuando el comando no está, y eso es lo que confunde.
Pensar que si which lo encuentra, el programa funciona.which solo confirma que hay un archivo ejecutable con ese nombre en el PATH; no lo corre. Puede fallar al ejecutarse por una librería faltante o una configuración rota. Para probarlo de verdad, ejecútalo: htop --version.
§ 4

Preguntas frecuentes

¿Qué hace el comando which?
Busca el nombre en el PATH y devuelve la ruta completa del archivo que la terminal ejecutaría. No lo ejecuta, no lo instala y no revisa si funciona. Sirve para saber de dónde viene una herramienta y para detectar si tienes dos versiones del mismo programa.
¿Cuál es la diferencia entre which y command -v?
which es un programa aparte, del paquete debianutils, y solo encuentra archivos ejecutables dentro del PATH. command -v es un comando interno de bash: también reconoce alias, funciones y comandos internos como cd, y no imprime nada extra. Para el día a día, command -v o type -a son más completos.
¿Cómo sé si un comando está instalado?
Con which -s comando y después echo $?. El código 0 quiere decir que sí existe y el 1 que no. También sirve el atajo: which -s htop && echo "sí está".
¿Qué es el PATH?
Es la lista de carpetas donde la terminal busca los comandos, en orden. La ves con echo $PATH y normalmente trae /usr/local/bin, /usr/bin, /bin y algunas más. Como se respeta el orden, una app que instalas a mano en /usr/local/bin gana sobre la de /usr/bin, y por eso pueden convivir dos versiones del mismo programa.
§ 5

Ver también