Cómo usar el comando which en Linux

Contenidos

Una ventana de terminal que se ejecuta en una computadora portátil con Linux.

El Linux which comando identifica el binario ejecutable que se inicia cuando se envía un comando al shell. Si tiene diferentes versiones del mismo programa en su computadora, puede utilizar which para saber cuál usará el shell.

Binarios y rutas

Cuando intenta ejecutar un programa o comando desde la ventana del terminal, el shell (de forma general, Intento en distribuciones modernas) tiene que hallar ese comando y ejecutarlo. Algunos comandos, como CD, historia, y pwd, están integrados en el shell, por lo que Bash no tiene que esforzarse demasiado para encontrarlos.

Pero, ¿cómo localiza Bash otros comandos, programas y binarios externos independientes? Bueno, Bash utiliza la ruta, que en realidad es una colección de rutas, cada una de las cuales apunta a un directorio. Después busca en cada uno de esos directorios un ejecutable que coincida con el comando o programa que está intentando ejecutar. Cuando encuentra uno, Bash lo lanza y abandona la búsqueda.

Puedes utilizar echo para chequear el $PATH variable de entorno y vea los directorios en su ruta. Para hacerlo, escriba lo siguiente y posteriormente presione Enter:

echo $PATH

La lista de salida separa cada ruta con dos puntos (:). En la computadora que estamos usando, Bash buscará los siguientes directorios en este orden:

  • /usr/local/sbin
  • /usr/local/bin
  • /usr/sbin
  • /usr/bin
  • /sbin
  • /bin
  • /user/games
  • /usr/local/games
  • /snap/bin

Hay muchas carpetas llamadas /sbin y /bin en el sistema de archivos, lo que puede generar cierta confusión.

Mira esos caminos

Digamos que tenemos una versión actualizada de un programa llamado htg. Está en nuestro directorio actual y podemos ejecutarlo escribiendo el siguiente comando:

./htg 

No es un gran programa, solo imprime el número de versión y posteriormente se cierra. La versión nueva es 1.2.138.

Para ejecutar un programa en el directorio de trabajo actual, debe escribir «./» delante del nombre del programa, para que Bash sepa dónde encontrarlo.

Debido a que queremos ejecutar este programa en particular desde cualquier directorio, vamos a mover el ejecutable al /usr/bin directorio. Bash encontrará ese programa en la ruta y lo ejecutará por nosotros.

No necesitamos el ejecutable en nuestro directorio actual, ni necesitamos escribir «./» delante del nombre del programa, como se muestra a continuación:

sudo mv htg /usr/bin

Ahora, intentemos ejecutar el programa escribiendo:

htg

Algo se ejecuta, pero no es nuestro programa nuevo y actualizado. Más bien, es la versión anterior, 1.2.105.

El que comando

El problema que demostramos previamente es por qué which mando fue diseñado.

En este ejemplo, usaremos which y pasar el nombre del programa que estamos investigando como parámetro de línea de comandos:

which htg

which informa que ha encontrado una versión de htg en el /usr/local/bin directorio. Debido a que esa ubicación aparece en la ruta antes del directorio al que movimos la actualización htg, Bash utiliza esa versión anterior del programa.

A pesar de esto, si usamos el -a (todo) opción como se muestra a continuación, which continúa buscando inclusive si encuentra una coincidencia:

which -a htg

Después enumera todas las coincidencias en cualquiera de los directorios de la ruta.

Entonces, ese es el problema: hay una versión anterior del programa en un directorio que además está en el parche. Y ese directorio se busca antes que el directorio en el que soltamos la versión nueva del programa.

Para verificar, podemos escribir lo siguiente y ejecutar explícitamente cada versión del programa:

/usr/local/bin/htg
/usr/bin/htg

Esto explica el problema y la respuesta es simple.

En realidad, tenemos opciones. Podemos quitar la versión anterior en el /use/local/bin directorio o moverlo de /usr/bin para /usr/local/bin.

Mira esos resultados

Dos resultados no necesariamente significan dos archivos binarios.

Veamos un ejemplo en el que usaremos el which comando con el -a (todos) y busque versiones de la less programa:

which -a less

which informa dos ubicaciones que albergan una versión del less programa, pero ¿es eso cierto? Sería extraño tener dos versiones diferentes (o la misma versión en varias ubicaciones) de less instalado en una computadora Linux. Entonces, no vamos a aceptar la salida de which. En cambio, profundicemos un poco más.

Podemos utilizar el ls, -l (lista larga), y -h opciones (legibles por humanos) para ver qué está pasando:

ls -lh /usr/bin/less

¡El tamaño del archivo se informa como nueve bytes! Definitivamente no es una copia completa de less.

El primer carácter de la lista es una «l». Un archivo normal tendría un guión (-) como primer carácter. La «l» es un símbolo que significa link simbólico. Si te perdiste ese detalle, el --> El símbolo además indica que se trata de un enlace simbólico, que puede considerar como una especie de atajo. Éste apunta a la copia de less en /bin.

Intentemos de nuevo con la versión de less en /bin:

ls -lh /bin/less

Esta entrada es por lo visto un ejecutable binario «real». El primer carácter de la lista es un guión (-), lo que significa que es un archivo normal y el tamaño del archivo es de 167 KB. Entonces, solo una copia de less está instalado, pero hay un link simbólico desde otro directorio, que Bash además encuentra cuando busca en la ruta.

RELACIONADO: Cómo utilizar el comando ls para enumerar archivos y directorios en Linux

Comprobación de varios comandos al mismo tiempo

Puede pasar varios programas y comandos a which, y los revisará en orden.

A modo de ejemplo, si escribe:

which ping cat uptime date head

which recorre la lista de programas y comandos que le proporcionó y enumera el resultado de cada uno.

Cual cual es cual?

Si lo desea, además puede usar which sobre sí mismo escribiendo lo siguiente:

which which

Al mismo tiempo de hurgar en el sistema de archivos de Linux por curiosidad, which es más útil cuando espera un conjunto de comportamientos de un comando o programa, pero obtiene otro.

Puedes utilizar which en estos casos, para verificar que el comando que está lanzando Bash sea el que desea usar.

setTimeout(function(){
!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version=’2.0′;
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s) } (window, document,’script’,
‘https://connect.facebook.net/en_US/fbevents.js’);
fbq(‘init’, ‘335401813750447’);
fbq(‘track’, ‘PageView’);
},3000);

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.